我以前遇到這類問題的時候寫的,你可以參考一下:
一.中文亂碼產生的原因
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格式的字符串。不會被此方法編碼的字符:! * ( ) '
一.中文亂碼產生的原因
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格式的字符串。不會被此方法編碼的字符:! * ( ) '