关注技术,关注生活

任何事情只要开始去做,永远不会太迟。
posts - 5, comments - 23, trackbacks - 0, articles - 18
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

当AJAX遭遇GBK的尴尬

Posted on 2006-12-30 13:34 errorfun 阅读(3944) 评论(6)  编辑  收藏 所属分类: Ajax

我在之前的一篇文章《struts,ajax乱码解决方案》中讲到ajax提交乱码的解决方案。这个方案在utf-8的编码下,不管提交或获取都没有变成乱码,但当你的客户端是GBK编码时提交就会出现乱码(获取时不会)。BeanSoft 说用encodeURIComponent保险,呵呵,这个不是我没试过,从一开始我就试过了encodeURIComponent ,escape,encodeURI,但最后出来的结果都没我说的那种好。它们使用的结果如下:
escape  后提交,getParameter出来的是null,
encodeURI 后提交,和没使用用的时候是一个样,
encodeURIComponent  后提交,包含特殊字符的请求都无法取得正确的值。

使用GBK编码提交后的数据在使用服务器端用new String( value.getBytes("gbk"), "utf-8")后部分可以恢复正确的中文,但有一部分无法恢复,这个原因估计是AJAX提交时设置了编码为UTF-8,但我字符的实际编码是GBK,所以在提交用用request.getParameter()获得的数据是用UTF-8的编码在GBK的字符集中找字符,像我在《struts,ajax乱码解决方案》中说的那样,UTF-8的编码可能有1位2位或3位16进制,如果它这个编码刚好是2位的话,那在GBK可以找到正确的字符(但并不是正确的),但如果是三位呢?那就惨了,它后面的字符全部就会变成乱码,比如%6D%51%C5 %E5%23%1C分别表示一个UTF-8编码的中文字符,那如果在GBK中,就会把它当成三个字符去查找,当然肯定是找不到的,有些找到的也是你读都读不出来的。用new String( value.getBytes("gbk"), "utf-8")后就是用GBK的编码在UTF-8的字符集中查找字符,如果刚好你的字符在UTF-8编码中全部是2位的话,那就能正确恢复,如果不是的话。。。。。。

现在还没找到在GBK编码下比较好的解决方案,但今天看到BeanSoft 的一篇文章《JSP 中 AJAX 的表单提交中文问题的简单解决方案》说到使用BASE64的方法,这个倒是没有试过,过两天放假的时候就试一下,如果成功了就跟大家共享一下。

PS:因为项目用也用到了FILTER,在提交后第一时间会被改变字符编码,不知道是不是这个增加的乱码解决的复杂性,当然我也试过在getParameter之前改变它的编码回utf-8,但结果是一样的。


评论

# re: 当AJAX遭遇GBK的尴尬  回复  更多评论   

2006-12-31 13:15 by superer
我在项目中也遇到了相同的问题
假设我使用ajax的方式向后台提交参数 test=测试数据
我会发现使用new String( value.getBytes("gbk"), "utf-8")转换回来的
数据为test=测试数? ,但是如果参数最后是以英文结束的时候就没有问题
例如test=测试数据abc,那么使用new String( value.getBytes("gbk"), "utf-8"),就可以正确得到test=测试数据abc

# re: 当AJAX遭遇GBK的尴尬  回复  更多评论   

2006-12-31 14:59 by BeanSoft
偶发表了一篇文章, 帮忙测试测试, 但愿在你们的方案中能通过. JSP 中 AJAX 的表单提交中文问题的简单解决方案 - GBK 版本(原创) http://www.blogjava.net/beansoft/archive/2006/12/31/91144.html 测试通过: Resin 3.0.18, Tomcat 5.0.30, 5.5.20; 浏览器: IE 6/Firefox 2.0

# re: 当AJAX遭遇GBK的尴尬  回复  更多评论   

2006-12-31 16:06 by errorfun
好,马上看看。试下能否成功

# re: 当AJAX遭遇GBK的尴尬  回复  更多评论   

2006-12-31 17:23 by errorfun
根据beanSoft的  JSP 中 AJAX 的表单提交中文问题的简单解决方案 - GBK 版本(原创) http://www.blogjava.net/beansoft/archive/2006/12/31/91144.html
果然可以解决,不得不汗一个,在GBK编码下,无论如何都不能用SEND方法发送参数,而要把参数加到URL中然后OPEN,不管是GET或POST都这样,真晕了。
使用encodeURIComponent 后的参数必须为UTF-8,如果不用的话就是XMLHTTP设置在CONTENT-TYPE中的CHARSET的编码,获取后可以用
new String( value.getBytes("iso-8859-1"), "utf-8")

new String( value.getBytes("iso-8859-1"), your_contenttype_charset)

# re: 当AJAX遭遇GBK的尴尬  回复  更多评论   

2006-12-31 17:29 by BeanSoft
谢谢测试! 不过你这种方式就是模拟GET了. 共同进步, 互相帮助. 你那个设置 content-type 的 charset 也很有用处的.

# re: 当AJAX遭遇GBK的尴尬  回复  更多评论   

2007-01-02 19:20 by errorfun[匿名]
要谢谢你才是啊。不过不用这种GET方法试来试去都不行啊。

只有注册用户登录后才能发表评论。


网站导航: