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