Web開發中文亂碼問題彙總

1.POST方式

POST請求數據是通過HTTP的BODY傳遞數據到服務器,瀏覽器會根據ContentType的編碼格式對參數進行編碼,服務端也是通過ContentType的編碼格式進行解碼,所以一般不會有亂碼問題,而且我們可以通過request.setCharacterEncoding(charset)進行設置。

html解碼方式選擇順序:
1.response中的ContentType 
2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
3. 默認編碼

2.GET方式

URL組成部分
瀏覽器對PathInfo和QueryString的編碼不一樣,不同瀏覽器對PathInfo也不同。

以Tomcat爲例,對URI解碼的字符集在<Connector port="8080" protocol="HTTP/1.1"/>中定義,默認是ISO-8859-1,因此,如果URI中如果包含中文,最好把URIEncoding設置成UTF-8,當然還需要設置QueryString爲ContentType的字符集,即設置useBodyEncodingForURI爲TRUE,如<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>

對於在HEADER中傳遞其他參數,如Cookie,redirectPath,Tomcat是通過默認解碼方式:ISO-8859-1,而且我們不能設置其他解碼方式,因此如果Header包含非ASCII字符,會亂碼,我們需要進行encodeURI(),然後進行傳遞,訪問時再相應的解碼。

注意:在myeclipse中run as server,會用myeclipse自帶的配置
eclipse server.xml

3.JS的編碼

不同瀏覽器對js的url編碼不同,甚至不同js框架對其url處理也不同。
對於這個問題需要了解兩個方法:

1.encodeURI
對整個URL進行UTF編碼(ASCII字符和一些特殊符號除外,如&,?,#等),在每個碼值前加“%”

2.encodeURIComponent
比encodeURI編碼更徹底,對整個URL進行UTF編碼(ASCII字符除外,&,?,#等都會進行編碼),常用語將一個URL作爲另一個URL的參數進行傳遞

注意:js的encodeURI默認是UTF-8編碼,而java對中文默認是GBK編碼,這種時候的解決辦法是encodeURI或者encodeURIComponent兩次編碼,request.getParameter()通過GBK解碼,如果需要獲取該字符串,再進行UTF-8解碼(URLDecoder.decode(str,”UTF-8”))即可。

如果已經設置URIEncoding=”UTF-8” useBodyEncodingForURI=”true” 則不需要進行encodeURI兩次編碼

附加:進行兩次encodeURI,第一次編碼得到的是UTF-8形式的URL,第二次編碼得到的依然是UTF-8形式的URL,但是在效果上相當於首先進行了一次UTF-8編碼(此時已經全部轉換爲ASCII字符),再進行了一次iso-8859-1編碼,因爲對英文字符來說UTF-8編碼和ISO-8859-1編碼的效果相同。在服務器端,首先通過request.getParameter()自動進行第一次解碼(可能是gb2312,gbk,utf-8,iso-8859-1等字符集,對結果無影響)得到ascii字符,然後再使用UTF-8進行第二次解碼,通常使用URLDecoder.decode(str,”UTF-8”)方法。

兩次編碼兩次解碼的過程爲:

UTF-8編碼->UTF-8(iso-8859-1)編碼->iso-8859-1解碼->UTF-8解碼,編碼和解碼的過程是對稱的,所以不會出現亂碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章