qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          做Java項目過程中遇到亂碼問題的解決方案

            在做java項目(特別是web項目)的過程中,中文亂碼一直是我們開發人員比較頭疼的問題,因為涉及到編碼,解碼,字符集,以及國際化等諸多問題,所以在著手解決的時候也缺乏相關的知識。我花了一些時間自己動手實驗了一把,雖然沒有洞悉編碼,解碼這些底層原理,但是解決實際問題應該足夠了。這里主要針對java web項目中的文亂碼問題。
            從瀏覽器采用form方式提交數據到服務器,可以分為post和get方法。
            1,post方法:
            在jsp頁面中的page指令中,有一個pageEncoding,這個指令表示jsp翻譯成servlet時采用的編碼,以及form提交數據的編碼格式。所以post方法提交數據的編碼格式由pageEncoding指定。那解碼方式呢?通常,我們在頁面設置了pageEncoding=”utf-8”,在后臺用request.getParameter()得到的往往是亂碼,而進一步通過new String(getBytes(“iso-8859-1”),”utf-8”)處理之后就能得到正確的數據。這是因為服務器默認的解碼方式是iso-8859-1,所以用編碼,解碼流程解釋上面那2個動作分別是:utf-8編碼—>iso-8859-1解碼(當然是亂碼);        utf-8編碼—>iso-8859-1解碼—>iso-8859-1編碼—>utf-8解碼,這是個對稱的過程,所以能正確得到數據。那服務器默認的解碼方式能改嗎?當然可以,調用request.setCharacterEncoding()就能設置,而且只針對post方式有效,設置以后request.getParameter()直接就是正確的數據了。
            2,get方法
            與post方法一樣,編碼方式由pageEncoding指定,但是get方式的解碼方式與post就不一樣了。在tomcat的conf目錄下有一個server.xml的配置文件,在里面找到Connector節點,有一個URIEncoding屬性,這個屬性就是指定get方式的數據解碼格式的,而且只針對get方式有效。其他處理與post一樣。
            另外,通過Ajax請求向后臺發送的數據由于是附在URL地址后面的,所以跟get請求一樣。編碼由pageEncoding指定,解碼由URIEncoding指定。但是有很多開發人員樂于另外一種方式:用兩次encodeURI編碼,然后在后臺用URLDecoder.decode(str,”utf-8”)解碼。這是一個什么過程呢?我們知道,encodeURI編碼是采用的utf-8編碼,所以,這個過程為:utf-8編碼—>utf-8編碼—>iso-8859-1解碼—>utf-8解碼。這看起來不像一個對稱過程,但最后為什么能得到正確結果呢?這是因為經過第一次utf-8編碼之后,產生的已經是非中文字符,所以,對非中文字符采再用utf-8編碼,iso-8859-1解碼不會有任何問題,這樣看來,它還是一個對稱的編碼,解碼過程,當然能正確解析了。
            當然,我所說的這個“對稱”編碼解碼過程,也不是所有編碼都適用,例如:
            gbk編碼—>utf-8解碼—>utf-8編碼—>gbk解碼,最后還是亂碼!
            因為gbk編碼—>utf-8解碼產生了不可恢復的錯誤,造成了信息丟失,至于為什么產生永久錯誤,得從編碼的底層說起……

          posted on 2014-09-10 09:24 順其自然EVO 閱讀(207) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德化县| 余干县| 聂荣县| 鲁山县| 化州市| 东阳市| 浏阳市| 舒兰市| 彭阳县| 博乐市| 左权县| 兰坪| 多伦县| 河北省| 博兴县| 石城县| 灯塔市| 木里| 土默特左旗| 威信县| 巴中市| 隆安县| 卫辉市| 彰武县| 苗栗县| 祥云县| 山东省| 博乐市| 防城港市| 启东市| 丽江市| 河津市| 舞阳县| 察哈| 全南县| 盈江县| 叶城县| 晋中市| 霸州市| 永和县| 和顺县|