項目亂碼問題和處理方案

第二部分我將記錄亂碼問題和處理方案。本次項目開發過程中碰見了許許多多亂碼的問題,希望這個記錄對以後開發會有幫助。具體的亂碼錯誤和相應的解決方案如下:
 
1.     由於Java默認使用UTF-8編碼,而且網上很多人都建議Struts開發的時候應儘量選用UTF-8做爲默認編碼,而非GBK。IDE使用Eclipse,在第一次使用Eclipse的時候應將default text editor改爲UTF-8編碼,免得日後後悔再改就慘了,我本次開發的時候就忽視了這一點,剛開始沒注意,結果到快交工時亂碼問題無法解決,導致將所有的文件全部修改一遍,嗚……
2.       使用SetCharacterEncodingFilter,這個很基礎的一套過濾器,將所有來自頁面的POST請求全部過濾爲UTF-8編碼。
3.       將JSP頁面全部改爲charset=UTF-8,這樣可以保證與後臺交互的時候都是UTF-8編碼,一般應用做了以上工作就基本可以應付了。
4.       國際化問題,在使用資源文件的時候,由於中文在properties文件中無法被程序所識別,需要將其進行轉碼,我在資源文件下面製作了一個很簡單的bat文件,每次修改資源文件的時候都是在一個臨時文件中修改,然後執行這個bat文件,將其轉化並保存爲所需要的資源文件,這個動作挺煩的,也有項目組成員使用一些插件,但是那些東西都是直接寫UTF-8碼的,有時候反倒不方便,不過以後任務量巨大的時候可能會考慮使用。Bat文件內容:   set path=%path%;%JAVA_HOME%/bin/,native2ascii -encoding UTF-8 ApplicationResources_bk.txt > ApplicationResources_zh.properties
5.       在本項目中大量採用了get方式提交請求並附加參數,結果導致編碼亂碼,原因是Tomcat默認請求編碼是ISO8859,需要在Tomcat的配置文件server.xml添加一個參數,URIEncoding=”UTF-8”,這樣請求中附件的參數就會以UTF-8來進行編碼。
6.       本項目中還少量使用到Ajax,JS也是默認使用ISO8859編碼,所以在進行請求時遇到中文參數需要進行編碼,如:var url = "GetSelectListAction.do?queryData=subTrade" + "&queryId=" + encodeURI(obj.value) + "&r=" + Math.random();   這裏有兩個地方需要注意:第一個地方是encodeURI(),方法,可以將參數進行轉碼,默認是轉化爲UTF-8,如果需要轉爲其他碼制,需要在方法中添加第二個參數。第二個地方是Math.random(),由於Ajax有緩存機制,在接受請求的時候第一時間先判斷該請求的地址是否被訪問過,如果被訪問過則直接使用緩存中的內容返回,這個東西很討厭,客戶在訪問過一次出錯後以後每次出現的都是這個錯誤,所以在請求中給其增加一個時間戳,只要可以隨機生成一個不同的字串就可以,保證Ajax每次都去訪問服務器。
7.       在項目即將交工的時候突然又出現亂碼問題,發現對於超長的漢字做爲參數傳遞仍然會出現亂碼問題,解決方法是採用java.net.URLEncoder的Encode方法強制轉碼,缺點是會使JSP頁面代碼相當的長,但是目前還沒有其他好的解決辦法,我想最好的辦法就是不用中文做爲參數傳遞 :P,寫法如:<a href="CreditInfoHonorPreAction.do?action=query&honorId=<bean:write name="honorInfoId" property="id" />&comName=<%= java.net.URLEncoder.encode(((com.shpcims.web.creditinfo.form.CreditInfoDetailInfoForm)pageContext.getRequest().getAttribute("creditInfoDetailInfoForm")).getCompanyName(),"UTF-8")%>&regNo=<%= java.net.URLEncoder.encode(((com.shpcims.web.creditinfo.form.CreditInfoDetailInfoForm)pageContext.getRequest().getAttribute("creditInfoDetailInfoForm")).getRegisterNo(),"UTF-8")%>">
至此,項目中瘋狂的亂碼問題才得以有效的控制,如果再出現問題真的要考慮是否出現了人品問題咯 :( 。這個亂碼問題在整個項目開發過程中始終伴隨着,簡直就是夢靨。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章