Java開發中經常會遇到亂碼問題,下面是幾個在開發中應該注意的問題:
1.盡量使用統一的編碼,如果你是重頭開發一個系統,特別是Java開發的,所有的文件包括js和css,數據庫連接都是用UTF-8進行編碼。
2.添加Filter進行編碼設定,這個是我們經常用的。
3.盡早統一開發環境,早點模擬真實環境測試,平臺可能造成亂碼問題。
二、亂碼發生的情況和應對措施
1.開發環境亂碼
由于Java默認使用UTF-8編碼,而且網上很多人都建議Struts開發的時候應盡量選用UTF-8做為默認編碼,而非GBK。IDE使用Eclipse,在第一次使用Eclipse的時候應將default text editor改為UTF-8編碼。
2.POST請求的過濾
這個是最基本的了,每個Servlet系統基本都會用到這個東西。不過只對POST請求有效,這個挺關鍵的。使用SetCharacterEncodingFilter,這個很基礎的一套過濾器,將所有來自頁面的POST請求全部過濾為UTF-8編碼。
3. JSP ,HTML頁面亂碼
將JSP頁面全部改為charset=UTF-8,這樣可以保證與后臺交互的時候都是UTF-8編碼,一般應用做了以上工作。
就基本可以應付了。
4.資源文件中漢字轉化UTF-8字符問題
國際化問題,在使用資源文件的時候,由于中文在properties文件中無法被程序所識別,需要將其進行轉碼,我在資源文件下面制作了一個很簡單的 bat文件,每次修改資源文件的時候都是在一個臨時文件中修改,然后執行這個bat文件,
set path=%path%;%JAVA_HOME%/bin/,native2ascii -encoding UTF-8 ApplicationResources_bk.txt >
ApplicationResources_zh.properties
5. GET請求亂碼
如果在本項目中采用了get方式提交請求并附加參數,結果導致編碼亂碼,原因是Tomcat默認請求編碼是ISO8859,需要在Tomcat的配置文件 server.xml添加一個參數,URIEncoding=”UTF-8”,這樣請求中附件的參數就會以UTF-8來進行編碼。這個方法不錯,將ajax中get方式請求中的中文全處理了。
6.Ajax請求亂碼
使用Ajax,JS 也是默認使用ISO8859編碼,所以在進行請求時遇到中文參數需要進行編碼,如:var url =
"GetSelectListAction.do?queryData=subTrade" + "&queryId=" + encodeURI(obj.value) + "&r=" +
Math.random();
這里有兩個地方需要注意:第一個地方是encodeURI(),方法,可以將參數進行轉碼,默認是轉化為UTF-8,如果需要轉為其他碼制,需要在方法中添加第二個參數。
第二個地方是Math.random(),由于Ajax有緩存機制,在接受請求的時候第一時間先判斷該請求的地址是否被訪問過,如果被訪問過則 直接使用緩存中的內容返回,這個東西很討厭,客戶在訪問過一次出錯后以后每次出現的都是這個錯誤,所以在請求中給其增加一個時間戳,只要可以隨機生成一個 不同的字串就可以,保證Ajax每次都去訪問服務器。
7. GET方法的另一個亂碼問題
在項目即將交工的時候突然又出現亂碼問題,發現對于超長的漢字做為參數傳遞仍然會出現亂碼問題,解決方法是采用java.net.URLEncoder的 Encode方法強制轉碼,缺點是會使JSP頁面代碼相當的長,但是目前還沒有其他好的解決辦法,我想最好的辦法就是不用中文做為參數傳遞:
<a href="TestAction.do?name=<%= java.net.URLEncoder.encode("你好","UTF-8")%>