URIEncoding和useBodyEncodingForURI詳解
之前關於編碼的問題已經總結過兩次了,有些地方寫的很粗略。
http://blog.itpub.net/29254281/viewspace-775925/
http://blog.itpub.net/29254281/viewspace-1063133/
Tomcat解決請求亂碼可以使用URIEncoding和useBodyEncodingForURI.下面是兩個引數的具體說明,參見ApacheTomcat官方手冊。
在上圖可以看到,中文亂碼容易出現在兩個地方。一個是所請求的資源名稱為中文,一個是查詢引數的內容包括中文。
更復雜的是,不同的瀏覽器可能使用兩種編碼分別處理URL和查詢引數。
useBodyEncodingForURI只是針對圖上"author=君山"的查詢引數(QueryString)有效,他的設定對於URL和URI無效。
下面以Windows環境為例,分別測試谷歌、火狐和IE瀏覽器請求中文資源和中文引數的亂碼情況。
下表是三種瀏覽器的編碼情況。其中IE的URI編碼可以調整為UTF8。
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/
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DR和BDR詳解
- 詳解 let 和 var
- require 和 import 詳解UIImport
- exp和imp詳解
- 詳解jdbcTemplate和namedParameterJdbcTemplateJDBC
- xargs 和 exec詳解
- jni和ndk詳解
- ckeckpoint和SCN詳解
- startActivityForResult和setResult詳解
- ROP漏洞詳解和利用
- WebRTC SDP 詳解和剖析Web
- pandas qcut 和cut 詳解
- [譯]KVC 和 KVO詳解
- cookie和session的詳解CookieSession
- HTTP和HTTPS詳解HTTP
- iOS KVC和KVO詳解iOS
- rowspan和colspan用法詳解
- HTTP和HTTPS詳解。HTTP
- IP校驗和詳解
- RabbitMQ的詳解和使用MQ
- 介面和抽象類詳解抽象
- android WebView詳解,常見漏洞詳解和安全原始碼AndroidWebView原始碼
- Vue $dispatch 和 $broadcast 詳解VueAST
- crontab和cron表示式詳解
- Git詳解和Github的使用Github
- Promise和async await詳解PromiseAI
- onSaveInstanceState和onRestoreInstanceState詳解REST
- javascript原型和原型鏈詳解JavaScript原型
- Java PATH和CLASSPATH配置詳解Java
- Blocks深入理解和詳解BloC
- jQuery offset()和position()用法詳解jQuery
- Get和Post請求詳解
- oracle pctfree和pctused詳解Oracle
- oracle中not in和not exsist詳解Oracle
- find和xargs使用詳解(轉)
- ind和xargs使用詳解(轉)
- Linux split 和 cat詳解Linux
- 詳解java的Collection和MapJava