javaweb 編碼問題

今天在測試一GET接口時,在瀏覽器輸入拼接的中文參數後臺亂碼了,我的頁面所有格式均設成UTF-8

格式,在後臺過濾器中用request.setCharacterEncoding("utf-8")方法將request的字符集設定爲utf-8,到網上仔細找下資料,原因在於TOMCAT 編碼未設置原因,可以再server.xml配置文件中加上URIEncoding="UTF-8" 。這個以前也碰到過,不總結就會忘,所以今天有找了相關的資料總結一下javaweb亂碼的原因。

1.瀏覽器拼中文參數亂碼(即get方式提交)

瀏覽器根據頁面的charset編碼方式對頁面進行編碼,然後提交至服務器,Tomcat對於get提交方式採用

的是server.xml文件中的URIEncoding編碼方式轉碼,而並不會採用過濾器中設置的編碼轉碼是如果瀏覽器中的編碼方式和tomcat中配置的編碼方式不同就會亂碼,tomcat 中默認的編碼方式是ISO-8859-1,所以今天才遇到這樣的亂碼。如果是其他系統需要調用你的接口,如果兩個系統編碼方式不同,在請求參數時,應將中文參數按接口系統的編碼進行編碼,纔行。

所以今天遇到的亂碼問題 我通過new String(變量值.getBytes("ISO-8859-1"),"UTF-8");  轉碼能獲取正

確變量值。

但像對於我現在用 jersey框架,不是通過request.getParameter的方式獲取而是採用@QueryParam

和@FormParam參數註解的方式獲取就不會亂碼。

2.POST方式提交

POST方式一般在後臺過濾其中配置了編碼格式,保持前後臺一致就不會亂碼。如果是外放接口,對方

編碼不一樣,需要將中文進行後臺編碼格式進行編碼,纔不會亂碼。

3.頁面鏈接中傳遞中文

保持頁面(pageEncoding="你的編碼"和tomcat編碼方式相同即可。或者在頁面中參數按tomcat編碼

進行編碼(URLEncoder.encode(參數值, input_charset) )後在傳至後臺。另一個解決辦法是使用js的encodeURI或者encodeURIComponent方法,進行編碼兩次,後臺再用你指定的編碼解碼一次,即可,因爲第一次編碼,你的參數內容便不帶有多字節字符了,成了純粹的 Ascii 字符串。(這裏把編第一次的結果叫成 [STR_ENC1] 好了。[STR_ENC1] 是不帶有多字節字符的)。再編一次後,提交,接收時容器自動解一次 (容器自動解的這一次,不管是按 GBK 還是 UTF-8 還是 ISO-8859-1 都好,都能夠正確的得到 [STR_ENC1])。再在程序中實現一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的參數的原值。(http://bbs.csdn.net/topics/330072196

4.包含中文名的頁面

如:測試.jsp 這個我確實很少用過,不過看網上資料如果瀏覽器的charset編碼方式和tomcat編碼一致

就不會亂碼,建議還是少用這種方式

 

 

很多東西自己理解也不是很深刻,如果有錯誤地方歡迎指正。

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