java基礎(chǔ)——servlet亂碼問(wèn)題

servlet 亂碼問(wèn)題

1. 亂碼的本質(zhì)

亂碼的本質(zhì)就是文件或者流存的編碼與讀的編碼不一樣,就會(huì)導(dǎo)致亂碼。

2.常用的編碼

  • gb2312、gbk、gb1830(系統(tǒng)默認(rèn)編碼,中國(guó)的國(guó)標(biāo)碼)

GB2312兼容ASCII碼,這部分還是每個(gè)字符占1個(gè)字節(jié)。每個(gè)漢字字符占2個(gè)字節(jié)。GB2312兼容ASCII碼,這部分還是每個(gè)字符占1個(gè)字節(jié)。每個(gè)漢字字符占2個(gè)字節(jié)

  • Unicode(萬(wàn)國(guó)碼,統(tǒng)一碼):

它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的編碼,以滿(mǎn)足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。

  • utf-8(支持全世界的編碼):

UTF-8對(duì)不同范圍的字符使用不同長(zhǎng)度的編碼,ASCII編碼部分與ASCII一樣,都是1個(gè)字節(jié)。而漢字部分都是3個(gè)字節(jié)。

  • iso-8859-1(不支持中文):

tomcat的默認(rèn)編碼

3.response響應(yīng)亂碼

3.1: 添加 response.setCharacterEncoding("utf-8");

添加上面語(yǔ)句,發(fā)現(xiàn)客戶(hù)端瀏覽器仍然亂碼。
原因:瀏覽器以默認(rèn)的編碼解析服務(wù)器編碼的數(shù)據(jù)。
結(jié)論:response.setCharacterEncoding("utf-8");只是告訴tomcat用什么編碼響應(yīng)數(shù)據(jù)。

3.2: 添加 response.setHeader("content-type", "text/html;charset=UTF-8");

添加上面語(yǔ)句,發(fā)現(xiàn)客戶(hù)端瀏覽器成功解決亂碼。
原因:瀏覽器以與服務(wù)器相同的編碼方式解析。
結(jié)論:response.setHeader("content-type", "text/html;charset=UTF-8");告訴瀏覽器用什么編碼方式解析數(shù)據(jù)。

綜上給出解決response亂碼方案:

response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");

另一種方案:

//告知服務(wù)器用什么碼表編碼,同時(shí)告知瀏覽器用什么碼表解碼。

response.setContentType("text/html;charset=utf-8");

4.request請(qǐng)求亂碼

  • post亂碼

瀏覽器發(fā)送post請(qǐng)求時(shí),瀏覽器使用的什么編碼提交那么post就是什么編碼。
由于客戶(hù)端沒(méi)有告訴服務(wù)器,請(qǐng)求正文的編碼,于是服務(wù)器默認(rèn)用ISO-8859-1進(jìn)行編碼

4.1 添加 request.setCharacterEncoding("utf-8"); 

成功解決亂碼
原因:訴服務(wù)器請(qǐng)求正文的數(shù)據(jù)應(yīng)該使用的編碼是什么

  • get亂碼

瀏覽器發(fā)送get請(qǐng)求時(shí),瀏覽器使用的什么編碼提交那么get就是什么編碼。
但是當(dāng)請(qǐng)求到達(dá)服務(wù)器后,get請(qǐng)求后面的參數(shù)默認(rèn)使用iso-8859-1進(jìn)行編碼。導(dǎo)致亂碼。

4.1 添加 request.setCharacterEncoding("utf-8"); 

上面代碼執(zhí)行后無(wú)效,沒(méi)能成功解決亂碼。
原因:此種解決方法只對(duì)post有效。

4.2 
 //拿到原始的二進(jìn)制數(shù)據(jù),用UTF-8進(jìn)行重新編碼
String name = reuqest.getParameter("name");
byte b[] = name.getBytes("ISO-8859-1");//1010101
String name = new String(b,"UTF-8");//解決

5.另一種解決亂碼的方法

tomcat安裝目錄conf/server.xml下有如下的配置:

 <Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

我們可以在里面添加一個(gè)與編碼有關(guān)的參數(shù)信息:URIEncoding,該配置決定了使用get請(qǐng)求通過(guò)瀏覽器地址訪(fǎng)問(wèn)欄的編碼方式,默認(rèn)的是iso-8859-1。
在官方文檔中國(guó)有說(shuō)明的:https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

于是我們可以這么配置:

 <Connector URIEncoding="utf-8" port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

6.總結(jié)

servlet中的亂碼是由于tomcat默認(rèn)的編碼是iso-8859-1 不支持中文,使用中文時(shí)就會(huì)出現(xiàn)問(wèn)題。解決亂碼也要分情況討論,響應(yīng)或者請(qǐng)求,后者又分為get與post兩種情況,當(dāng)然有時(shí)還要考慮數(shù)據(jù)庫(kù)亂碼問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容