java web 中亂碼問題

String name = new String(request.getParameter("username").getBytes("iso-8859-1"),"gbk");
這樣的接受參數的方法是一個通用的方法,不管是對get或post提交的方法都有效

 

一.中文亂碼產生的原因
a)亂碼有很多種,這裏所說的是指web傳入的亂碼,即由瀏覽器傳輸數據到服務器發生的亂碼。

b)常用的web傳輸方法有 post 和 get 2種,下面分別說明:
i.        Post – 由於採用了特殊的加密,所以只要設置正確的Character Encoding即可,不會產生亂碼
ii.        Get - 用此類方法傳輸的數據將以字符串的形式直接放在url後面,所以採用的是url 的encode,這種情況不僅會出現中文亂碼,而且假如參數裏面帶有保留字符也將被轉義,特別地,如果參數中帶有&字符,將丟失後面的所有參數或者值


二.解決辦法
解決中文亂碼(應該說是數據傳輸問題),主要應該從用法上解決。上面說了post方法只要設置了正確的Character Encoding,是不會產生亂碼的,所以應儘量採用post方法來傳輸數據;但是有時候採用get方法是比較方便的,或者是必須的,所以下面也分別介紹2種的對應解決方案:
a)        Post – 在web.xml設置filter,filter-class指定爲平臺的SetCharacterEncodingFilter類,encoding設置爲頁面使用的編碼,示例:
<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>
                //自己實現一個filter。。
        </filter-class>
        <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>


b)        Get – 解決的關鍵在於在傳輸之前調用url encoder對參數進行加密,採用的encoding應與服務器的encoding一致,這樣接收到數據的時候可以不做任何的轉碼。可由java和javascript2種辦法實現:
i.        Java 實現方法(推薦)
1.        條件 - 如果要傳輸的數據是要先經過javabean生成,然後write 到頁面上的,可以採用這種方式。以下略,用java.net.URLEncoder.encode();


ii.        Javascript 實現方法
如果需要從頁面獲取輸入,則可以採用這種方式,但是這種情況又可以考慮是否可以轉換爲post方法來傳輸。
            下面是javascript的encode函數:
1.        escape - 採用ISO Latin字符集對指定的字符串進行編碼。不會被此方法編碼的字符: @ * / +

2.        encodeURI - 把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '

3.        encodeURIComponent - 把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。不會被此方法編碼的字符:! * ( ) '

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