ajax中文亂碼原因分析及解決方案

開始用JAVA做J2EE項目的時候, 很多人會遇到亂碼問題,這個比較好解決,網上有很多成熟的解決方案,原理也廣爲大家所知。
  我下面只簡述一下這種情況下亂碼的原因及解決方案:無論是Struts用的action還是、jsp頁面、或者其它,最終會被編譯成servlet程序由用戶來調用。這些servlet是以UNICODE編碼的。其實servlet用什麼編碼並不重要,重要的是servlet的輸入和輸出以同樣的方案編碼就不會有亂碼。
  常見的亂碼有兩種:一個是表單提交出現亂碼;一個是以地址欄傳參數出現亂碼。
  針對第一種形式的亂碼,可以在每個jsp頁面加上<%@ page pageEncoding="GB18030"%>注:jsp2.0適用;    或者加上<%@ page contentType="text/html; charset=GB18030"%>,“GB2312”、“GBK”、“UTF-8”也可以,反正整個系統中統一就可以。還有一種方式是使用request.setCharsetEncoding("GB18030"),可以使用Filter統一處理。
  針對地址欄參數出現亂碼的情況,解決方案如下(tomcat適用,其它的沒有弄過):
     在tomcat的配置文件:server.xml中,找到connector元素,在後面加上一個屬性ERIEncoding="GB18030",GB18030是我用的編碼方案,在讀者的項目中,可以設定成系統中統一使用的編碼方案。注意connector元素有兩個,一個是針對http,一個是針對https,可以都加上。

  下面討論一下Ajax方式下的亂碼問題:首先,如果整個項目使用UTF-8編碼,並對request(調用xmlhttp對象的setrequestheader("contentType","text/html;charset=uft-8")方法)進行了正確的編碼,就不會有亂碼;如果整個項目選用了GB18030方案編碼,那麼一般情況下會出現亂碼。產生的原因就是:xmlhttp使用了UTF-8方案對傳遞的參數進行編碼(這也是整個項目使用UTF-8編碼不出現亂碼的原因)。我們可以做一個試驗對此進行驗證:
String str ="博客";
String newstr = new String(str.getBytes("UTF-8"),"GB18030");
如果你的系統使用的WINDOW,項目使用的是GB18030(或者GBK或者GB2312),輸出newstr就會是亂碼,這個亂碼應該與你使用ajax提交中文“博客”所得到的亂碼是一致的。    還有個問題,
String newstr2=new String(newstr.getBytes("GB18030"),"UTF-8");這樣再得到一個新的字符串,這個字符串與初始的字符串str並不相同,最後一個字會是亂碼,這個我不知道是什麼原因,那們知道原因請告訴我一下。
  這樣,知道了原理就可以找方法來避免亂碼了。經過試驗我找到兩種方法來解決Ajax的亂碼問題(其實原理是一樣的):
   前提是使用setrequestheader方法進行了正確的編碼(POST方式提交數據時,要使用xxx-application-url方案編碼,不知寫對了沒有。呵呵。)。
  一、提交中文後,服務器端使用
先使用UTF-8編碼提取參數:
request.setCharsetEncoding("UTF-8");
String str = request.getParameter("param");
這樣就可以得到正確的參數。
  二、可以使用encodeURI進行兩次編碼,然後在服務器端使用以下方式(這個是我以前的解決方案,顯得很土,主要是當時對亂碼原理沒有弄清):
String str = request.getParameter("param");
然後使用下面的方式進行解碼:
java.net.URIDecode.decode(str,"UTF-8")
這樣同樣可以得到正確的參數。

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章