URIEncoding和useBodyEncodingForURI詳解

壹頁書發表於2014-01-20
之前關於編碼的問題已經總結過兩次了,有些地方寫的很粗略。
http://blog.itpub.net/29254281/viewspace-775925/
http://blog.itpub.net/29254281/viewspace-1063133/

Tomcat解決請求亂碼可以使用URIEncoding和useBodyEncodingForURI.下面是兩個引數的具體說明,參見ApacheTomcat官方手冊。
URIEncoding
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
useBodyEncodingForURI
This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.



在上圖可以看到,中文亂碼容易出現在兩個地方。一個是所請求的資源名稱為中文,一個是查詢引數的內容包括中文。
更復雜的是,不同的瀏覽器可能使用兩種編碼分別處理URL和查詢引數。
useBodyEncodingForURI只是針對圖上"author=君山"的查詢引數(QueryString)有效,他的設定對於URL和URI無效。
下面以Windows環境為例,分別測試谷歌、火狐和IE瀏覽器請求中文資源和中文引數的亂碼情況。

下表是三種瀏覽器的編碼情況。其中IE的URI編碼可以調整為UTF8。

預設URI編碼 預設查詢引數編碼
谷歌 UTF8 UTF8
火狐 UTF8 GBK
IE GBK GBK

1.Tomcat的URIEncoding設定為UTF8
谷歌正常
火狐可以請求到資源,但是查詢引數的中文為亂碼
IE不能請求到資源

測試程式碼如下

測試結果如下:


2.將IE的URI編碼設定為UTF8,開啟useBodyEncodingForURI,並設定request的字符集為GBK。

針對URI和查詢引數使用兩種編碼的情況,可以使用useBodyEncodingForURI。他會根據http body設定的字符集解碼。
將IE設定為"傳送UTF8的URL"之後,三種瀏覽器都使用UTF8作為URI編碼,但是IE和火狐的查詢引數使用GBK編碼,而谷歌的查詢引數使用UTF8編碼。所以在這種情況下,IE和火狐的訪問都是正常的,而使用谷歌瀏覽器,可以訪問資源,但是中文的查詢引數則是亂碼。

測試結果:


實驗得出的結論是
1.URIEncoding和useBodyEncodingForURI都可以處理中文亂碼的問題
2.瀏覽器對於URI和查詢引數可能使用兩種不同的編碼方式,這種情況下,可以使用useBodyEncodingForURI調整查詢引數的編碼。

參考:
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1073278/,如需轉載,請註明出處,否則將追究法律責任。

相關文章