我在之前的一篇文章《struts,ajax亂碼解決方案》中講到ajax提交亂碼的解決方案。這個(gè)方案在utf-8的編碼下,不管提交或獲取都沒(méi)有變成亂碼,但當(dāng)你的客戶(hù)端是GBK編碼時(shí)提交就會(huì)出現(xiàn)亂碼(獲取時(shí)不會(huì))。BeanSoft 說(shuō)用encodeURIComponent保險(xiǎn),呵呵,這個(gè)不是我沒(méi)試過(guò),從一開(kāi)始我就試過(guò)了encodeURIComponent ,escape,encodeURI,但最后出來(lái)的結(jié)果都沒(méi)我說(shuō)的那種好。它們使用的結(jié)果如下:
escape? 后提交,getParameter出來(lái)的是null,
encodeURI 后提交,和沒(méi)使用用的時(shí)候是一個(gè)樣,
encodeURIComponent? 后提交,包含特殊字符的請(qǐng)求都無(wú)法取得正確的值。
使用GBK編碼提交后的數(shù)據(jù)在使用服務(wù)器端用new String( value.getBytes("gbk"), "utf-8")后部分可以恢復(fù)正確的中文,但有一部分無(wú)法恢復(fù),這個(gè)原因估計(jì)是AJAX提交時(shí)設(shè)置了編碼為UTF-8,但我字符的實(shí)際編碼是GBK,所以在提交用用request.getParameter()獲得的數(shù)據(jù)是用UTF-8的編碼在GBK的字符集中找字符,像我在《struts,ajax亂碼解決方案》中說(shuō)的那樣,UTF-8的編碼可能有1位2位或3位16進(jìn)制,如果它這個(gè)編碼剛好是2位的話(huà),那在GBK可以找到正確的字符(但并不是正確的),但如果是三位呢?那就慘了,它后面的字符全部就會(huì)變成亂碼,比如%6D%51%C5 %E5%23%1C分別表示一個(gè)UTF-8編碼的中文字符,那如果在GBK中,就會(huì)把它當(dāng)成三個(gè)字符去查找,當(dāng)然肯定是找不到的,有些找到的也是你讀都讀不出來(lái)的。用new String( value.getBytes("gbk"), "utf-8")后就是用GBK的編碼在UTF-8的字符集中查找字符,如果剛好你的字符在UTF-8編碼中全部是2位的話(huà),那就能正確恢復(fù),如果不是的話(huà)。。。。。。
現(xiàn)在還沒(méi)找到在GBK編碼下比較好的解決方案,但今天看到BeanSoft 的一篇文章《JSP 中 AJAX 的表單提交中文問(wèn)題的簡(jiǎn)單解決方案》說(shuō)到使用BASE64的方法,這個(gè)倒是沒(méi)有試過(guò),過(guò)兩天放假的時(shí)候就試一下,如果成功了就跟大家共享一下。
PS:因?yàn)轫?xiàng)目用也用到了FILTER,在提交后第一時(shí)間會(huì)被改變字符編碼,不知道是不是這個(gè)增加的亂碼解決的復(fù)雜性,當(dāng)然我也試過(guò)在getParameter之前改變它的編碼回utf-8,但結(jié)果是一樣的。
評(píng)論
# re: 當(dāng)AJAX遭遇GBK的尷尬 回復(fù) 更多評(píng)論
2006-12-31 13:15 by superer我在項(xiàng)目中也遇到了相同的問(wèn)題
假設(shè)我使用ajax的方式向后臺(tái)提交參數(shù) test=測(cè)試數(shù)據(jù)
我會(huì)發(fā)現(xiàn)使用new String( value.getBytes("gbk"), "utf-8")轉(zhuǎn)換回來(lái)的
數(shù)據(jù)為test=測(cè)試數(shù)? ,但是如果參數(shù)最后是以英文結(jié)束的時(shí)候就沒(méi)有問(wèn)題
例如test=測(cè)試數(shù)據(jù)abc,那么使用new String( value.getBytes("gbk"), "utf-8"),就可以正確得到test=測(cè)試數(shù)據(jù)abc
假設(shè)我使用ajax的方式向后臺(tái)提交參數(shù) test=測(cè)試數(shù)據(jù)
我會(huì)發(fā)現(xiàn)使用new String( value.getBytes("gbk"), "utf-8")轉(zhuǎn)換回來(lái)的
數(shù)據(jù)為test=測(cè)試數(shù)? ,但是如果參數(shù)最后是以英文結(jié)束的時(shí)候就沒(méi)有問(wèn)題
例如test=測(cè)試數(shù)據(jù)abc,那么使用new String( value.getBytes("gbk"), "utf-8"),就可以正確得到test=測(cè)試數(shù)據(jù)abc
# re: 當(dāng)AJAX遭遇GBK的尷尬 回復(fù) 更多評(píng)論
2006-12-31 14:59 by BeanSoft偶發(fā)表了一篇文章, 幫忙測(cè)試測(cè)試, 但愿在你們的方案中能通過(guò). JSP 中 AJAX 的表單提交中文問(wèn)題的簡(jiǎn)單解決方案 - GBK 版本(原創(chuàng)) http://www.aygfsteel.com/beansoft/archive/2006/12/31/91144.html 測(cè)試通過(guò): Resin 3.0.18, Tomcat 5.0.30, 5.5.20; 瀏覽器: IE 6/Firefox 2.0
# re: 當(dāng)AJAX遭遇GBK的尷尬 回復(fù) 更多評(píng)論
2006-12-31 16:06 by errorfun好,馬上看看。試下能否成功
# re: 當(dāng)AJAX遭遇GBK的尷尬 回復(fù) 更多評(píng)論
2006-12-31 17:23 by errorfun根據(jù)beanSoft的 JSP 中 AJAX 的表單提交中文問(wèn)題的簡(jiǎn)單解決方案 - GBK 版本(原創(chuàng)) http://www.aygfsteel.com/beansoft/archive/2006/12/31/91144.html
果然可以解決,不得不汗一個(gè),在GBK編碼下,無(wú)論如何都不能用SEND方法發(fā)送參數(shù),而要把參數(shù)加到URL中然后OPEN,不管是GET或POST都這樣,真暈了。
使用encodeURIComponent 后的參數(shù)必須為UTF-8,如果不用的話(huà)就是XMLHTTP設(shè)置在CONTENT-TYPE中的CHARSET的編碼,獲取后可以用
new String( value.getBytes("iso-8859-1"), "utf-8")
和
new String( value.getBytes("iso-8859-1"), your_contenttype_charset)
果然可以解決,不得不汗一個(gè),在GBK編碼下,無(wú)論如何都不能用SEND方法發(fā)送參數(shù),而要把參數(shù)加到URL中然后OPEN,不管是GET或POST都這樣,真暈了。
使用encodeURIComponent 后的參數(shù)必須為UTF-8,如果不用的話(huà)就是XMLHTTP設(shè)置在CONTENT-TYPE中的CHARSET的編碼,獲取后可以用
new String( value.getBytes("iso-8859-1"), "utf-8")
和
new String( value.getBytes("iso-8859-1"), your_contenttype_charset)
# re: 當(dāng)AJAX遭遇GBK的尷尬 回復(fù) 更多評(píng)論
2006-12-31 17:29 by BeanSoft謝謝測(cè)試! 不過(guò)你這種方式就是模擬GET了. 共同進(jìn)步, 互相幫助. 你那個(gè)設(shè)置 content-type 的 charset 也很有用處的.
# re: 當(dāng)AJAX遭遇GBK的尷尬 回復(fù) 更多評(píng)論
2007-01-02 19:20 by errorfun[匿名]要謝謝你才是啊。不過(guò)不用這種GET方法試來(lái)試去都不行啊。
只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||
相關(guān)文章:
|
||