我以前遇到這類問題的時候?qū)懙?你可以參考一下:
一.中文亂碼產(chǎn)生的原因
a)亂碼有很多種,這里所說的是指web傳入的亂碼,即由瀏覽器傳輸數(shù)據(jù)到服務(wù)器發(fā)生的亂碼。
b)常用的web傳輸方法有 post 和 get 2種,下面分別說明:
i.? ? ? ? Post – 由于采用了特殊的加密,所以只要設(shè)置正確的Character Encoding即可,不會產(chǎn)生亂碼
ii.? ? ? ? Get - 用此類方法傳輸?shù)臄?shù)據(jù)將以字符串的形式直接放在url后面,所以采用的是url
的encode,這種情況不僅會出現(xiàn)中文亂碼,而且假如參數(shù)里面帶有保留字符也將被轉(zhuǎn)義,特別地,如果參數(shù)中帶有&字符,將丟失后面的所有參數(shù)或
者值
二.解決辦法
解決中文亂碼(應(yīng)該說是數(shù)據(jù)傳輸問題),主要應(yīng)該從用法上解決。上面說了post方法只要設(shè)置了正確的Character
Encoding,是不會產(chǎn)生亂碼的,所以應(yīng)盡量采用post方法來傳輸數(shù)據(jù);但是有時候采用get方法是比較方便的,或者是必須的,所以下面也分別介紹
2種的對應(yīng)解決方案:
a)? ? ? ? Post – 在web.xml設(shè)置filter,filter-class指定為平臺的SetCharacterEncodingFilter類,encoding設(shè)置為頁面使用的編碼,示例:
<filter>
? ? ? ? <filter-name>Set Character Encoding</filter-name>
? ? ? ? <filter-class>
? ? ? ? ? ? ? ? //自己實現(xiàn)一個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 – 解決的關(guān)鍵在于在傳輸之前調(diào)用url encoder對參數(shù)進行加密,采用的encoding應(yīng)與服務(wù)器的encoding一致,這樣接收到數(shù)據(jù)的時候可以不做任何的轉(zhuǎn)碼??捎蒵ava和javascript2種辦法實現(xiàn):
i.? ? ? ? Java 實現(xiàn)方法(推薦)
1.? ? ? ? 條件 - 如果要傳輸?shù)臄?shù)據(jù)是要先經(jīng)過javabean生成,然后write 到頁面上的,可以采用這種方式。以下略,用java.net.URLEncoder.encode();
ii.? ? ? ? Javascript 實現(xiàn)方法
如果需要從頁面獲取輸入,則可以采用這種方式,但是這種情況又可以考慮是否可以轉(zhuǎn)換為post方法來傳輸。
? ?? ?? ?? ?下面是javascript的encode函數(shù):
1.? ? ? ? escape - 采用ISO Latin字符集對指定的字符串進行編碼。不會被此方法編碼的字符: @ * / +
2.? ? ? ? encodeURI - 把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '
3.? ? ? ? encodeURIComponent - 把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串。不會被此方法編碼的字符:! * ( ) '
posted on 2008-07-11 15:12
無聲 閱讀(458)
評論(0) 編輯 收藏 所屬分類:
職場生活