1、jsp、servlet字符集要統(tǒng)一,如果要用gbk就都用gbk.或者都用utf-8.我都統(tǒng)一用得是utf-8;(我在servlet中分別對(duì)request和response進(jìn)行了字符集設(shè)置,并且還應(yīng)用 new String(S.getBypes(ISO-8859-1),"UTF-8" ) 由于他和request的設(shè)置的作用是相同的, 所以我得到還是亂碼,由此可以看出不是吧所有的字符集設(shè)置都加上就是正確的) 2、在未插入數(shù)據(jù)庫之前一定要確認(rèn)servlet在jsp頁面獲得的是否為中文。 3、Ibatis 在連接mysql的時(shí)候 url 里面加的characterEncoding 的值要和mysql的字符集一制。 4、為解決中文問題,mysql我用的gbk. 5、Mysql5.0 的驅(qū)動(dòng)也很重要,驅(qū)動(dòng)要和mysql的版本一致,要不然也會(huì)出問題,這個(gè)是出現(xiàn)中文字符亂碼的原因之一。 6、Tomcat 字符集的設(shè)置,修改 D:\Tomcat 6.0\conf\server.xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="9443" URIEncoding='GBK' /> 增加對(duì)GET方法獲取數(shù)據(jù)時(shí)的編碼設(shè)置參數(shù) URIEncoding='GBK',(設(shè)置tomcat對(duì)我項(xiàng)目影響不大,我剛才測試了一下,如果不設(shè)置也正常運(yùn)行,設(shè)置這項(xiàng)對(duì)于用get方法獲取參數(shù)是有作用) 7、我在網(wǎng)上查了好多的資料好多人都說mysql和jsp、servlet 最好統(tǒng)一字符,確實(shí)統(tǒng)一字符會(huì)少很多麻煩,由于我的mysql設(shè)置成utf-8就有問題,所以我就設(shè)置成gbk的了!按照網(wǎng)上說的更改my.ini 文件結(jié)合設(shè)置語句,都統(tǒng)一成下面這樣了 8、其實(shí)遇到中文亂碼問題的人很多,主要原因就是沒有弄清jsp、servlet、mysql之間字符集是怎么轉(zhuǎn)換的,個(gè)人認(rèn)為應(yīng)該先從理論上理解,自己在做一些測試,如果還是有問題,就要一步一步的測試,中文問題也就容易解決了! 針對(duì)字符集的問題我查閱了很多資料,下面整體進(jìn)行總結(jié)一下: 下面對(duì)于字符集的設(shè)置在jsp、servlet、mysql、tomcat中的作用 首先要清楚幾個(gè)名詞解釋及其作用 1. contentType: <%@ page contentType="text/html; charset=UTF-8″%> 2. pageEncoding:<%@ page pageEncoding="UTF-8″%> 3. html頁面charset:<META http-equiv="Content-Type" content="text/html; charset=UTF-8″> 4. setCharacterEncoding:request.setCharacterEncoding(),response.setCharacterEncoding() 5. setContentType:response.setContentType() 6. jsp頁面編碼: jsp文件本身的編碼 7. web頁面顯示編碼:jsp的輸出流在瀏覽器中顯示的編碼 8. web頁面輸入編碼: 輸入框輸入的字體編碼 9. web服務(wù)器輸入的請(qǐng)求流: web Server相應(yīng)瀏覽器的請(qǐng)求數(shù)據(jù) 10. web服務(wù)器輸出的響應(yīng)流: web Server相應(yīng)瀏覽器的輸出數(shù)據(jù) 1、JSP/Servlet中的幾個(gè)字符編碼的作用 在JSP/Servlet中主要有以下幾個(gè)地方可以設(shè)置編碼,pageEncoding="UTF-8"、contentType="text /html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和 response.setCharacterEncoding("UTF-8"),其中前兩個(gè)只能用于JSP中,而后兩個(gè)可以用于JSP和Servlet 中。 (1)pageEncoding="UTF-8"的作用是設(shè)置JSP編譯成Servlet時(shí)使用的編碼。 眾所周知,JSP在服務(wù)器上是要先被編譯成Servlet的。pageEncoding="UTF-8"的作用就是告訴JSP編譯器在將JSP文件編譯成 Servlet時(shí)使用的編碼。通常,在JSP內(nèi)部定義的字符串(直接在JSP中定義,而不是從瀏覽器提交的數(shù)據(jù))出現(xiàn)亂碼時(shí),很多都是由于該參數(shù)設(shè)置錯(cuò)誤 引起的。例如,你的JSP文件是以GBK為編碼保存的,而在JSP中卻指定pageEncoding="UTF-8",就會(huì)引起JSP內(nèi)部定義的字符串為 亂碼。 另外,該參數(shù)還有一個(gè)功能,就是在JSP中不指定contentType參數(shù),也不使用response.setCharacterEncoding方法時(shí),指定對(duì)服務(wù)器響應(yīng)進(jìn)行重新編碼的編碼。 補(bǔ)充: pageEncoding, 只是指明了 JSP 頁面本身的編碼格式,跟頁面顯示的編碼沒有關(guān)系; 容器在讀?。ㄎ募┗蛘撸〝?shù)據(jù)庫)或者(字符串常量)時(shí)將起轉(zhuǎn)化為內(nèi)部使用的 Unicode,而 頁面顯示的時(shí)候?qū)?nèi)部的Unicode轉(zhuǎn)換為contentType指定的編碼后顯示頁面內(nèi)容;如果pageEncoding屬性存在,那么JSP頁面的 字符編碼方式就由pageEncoding決定,否則就由contentType屬性中的charset決定,如果charset也不存在,JSP頁面的 字符編 碼方式就采用默認(rèn)的ISO-8859-1. (2)contentType="text/html;charset=UTF-8"的作用是指定對(duì)服務(wù)器響應(yīng)進(jìn)行重新編碼的編碼。 在不使用response.setCharacterEncoding方法時(shí),用該參數(shù)指定對(duì)服務(wù)器響應(yīng)進(jìn)行重新編碼的編碼。服務(wù)器在將數(shù)據(jù)發(fā)送到瀏覽器前,對(duì)數(shù)據(jù)進(jìn)行重新編碼時(shí),使用的就是該編碼。 (3)request.setCharacterEncoding("UTF-8")的作用是設(shè)置對(duì)客戶端請(qǐng)求進(jìn)行重新編碼的編碼。 該方法用來指定對(duì)瀏覽器發(fā)送來的數(shù)據(jù)進(jìn)行重新編碼(或者稱為解碼)時(shí),使用的編碼 (4)response.setCharacterEncoding("UTF-8")的作用是指定對(duì)服務(wù)器響應(yīng)進(jìn)行重新編碼的編碼。服務(wù)器在將數(shù)據(jù)發(fā)送到瀏覽器前,對(duì)數(shù)據(jù)進(jìn)行重新編碼時(shí),使用的就是該編碼。 其次,要說一說瀏覽器是怎么樣對(duì)接收和發(fā)送 的數(shù)據(jù)進(jìn)行編碼的 response.setCharacterEncoding("UTF-8")的作用是指定對(duì)服務(wù)器響應(yīng)進(jìn)行重新編碼的編碼。同時(shí),瀏覽器也是根據(jù)這個(gè) 參數(shù)來對(duì)其接收到的數(shù)據(jù)進(jìn)行重新編碼(或者稱為解碼)。所以在無論你在JSP中設(shè)置 response.setCharacterEncoding("UTF-8")或者 response.setCharacterEncoding("GBK"),瀏覽器均能正確顯示中文(前提是你發(fā)送到瀏覽器的數(shù)據(jù)編碼是正確的,比如正 確設(shè)置了pageEncoding參數(shù)等)。讀者可以做個(gè)實(shí)驗(yàn),在JSP中設(shè)置response.setCharacterEncoding("UTF- 8"),在IE中顯示該頁面時(shí),在IE的菜單中選擇"查看(V)"à"編碼(D)"中可以查看到是" Unicode(UTF-8)",而在在JSP中設(shè)置response.setCharacterEncoding("GBK"),在IE中顯示該頁面 時(shí),在IE的菜單中選擇"查看(V)"à"編碼(D)"中可以查看到是"簡體中文(GB2312)". 瀏覽器在發(fā)送數(shù)據(jù)時(shí),對(duì)URL和參數(shù)會(huì)進(jìn)行URL編碼,對(duì)參數(shù)中的中文,瀏覽器也是使用response.setCharacterEncoding參數(shù) 來進(jìn)行URL編碼的。以百度和GOOGLE為例,如果你在百度中搜索"漢字",百度會(huì)將其編碼為"%BA%BA%D7%D6".而在GOOGLE中搜索" 漢字",GOOGLE會(huì)將其編碼為"%E6%B1%89%E5%AD%97",這是因?yàn)榘俣鹊?response.setCharacterEncoding參數(shù)為GBK,而GOOGLE的的 response.setCharacterEncoding參數(shù)為UTF-8. 瀏覽器在接收服務(wù)器數(shù)據(jù)和發(fā)送數(shù)據(jù)到服務(wù)器時(shí)所使用的編碼是相同的,默認(rèn)情況下均為JSP頁面的 response.setCharacterEncoding參數(shù)(或者contentType和pageEncoding參數(shù)),我們稱其為瀏覽器編 碼。當(dāng)然,在IE中可以修改瀏覽器編碼(在IE的菜單中選擇"查看(V)"à"編碼(D)"中修改),但通常情況下,修改該參數(shù)會(huì)使原本正確的頁面中出現(xiàn) 亂碼。一個(gè)有趣的例子是,在IE中瀏覽GOOGLE的主頁時(shí),將瀏覽器編碼修改為"簡體中文(GB2312)",此時(shí),頁面上的中文會(huì)變成亂碼,不理它, 在文本框中輸入"漢字",提交,GOOGLE會(huì)將其編碼為"%BA%BA%D7%D6",可見,瀏覽器在對(duì)中文進(jìn)行URL編碼時(shí),使用的就是瀏覽器編碼。 弄清了瀏覽器是在接收和發(fā)送數(shù)據(jù)時(shí),是如何對(duì)數(shù)據(jù)進(jìn)行編碼的了,我們再來看看服務(wù)器是在接收和發(fā)送數(shù)據(jù)時(shí),是如何對(duì)數(shù)據(jù)進(jìn)行編碼的。 對(duì)于發(fā)送數(shù)據(jù),服務(wù)器按照response.setCharacterEncoding-contentType-pageEncoding的優(yōu)先順序,對(duì)要發(fā)送的數(shù)據(jù)進(jìn)行編碼。 對(duì)于接收數(shù)據(jù),要分三種情況。一種是瀏覽器直接用URL提交的數(shù)據(jù),另外兩種是用表單的GET和POST方式提交的數(shù)據(jù)。 因?yàn)楦鞣NWEB服務(wù)器對(duì)這三種方式的處理也不相同,所以我們以Tomcat5.0為例。
|
|