the encoding……

当我和小K使用ajax来request(get), 请求的时候, 中文碰到乱码问题. 无论是否将请求的参数urlencode(gb2312)或者escape, encode是乱码, escape是null…… 而这一切在php里并不发生.

于是换了N种姿势, 就在认定我们2个有人品问题的时候发现, 貌似getQueryString没有问题, 猛然想起getParameter的时候是编码过的. 尝试给prototype加header未果, 貌似是因为xmlhttp本身机制问题, 因为xmlhttp本身即以uft-8来request的, 更大的问题在于我的servlet又是gb的. 实在想不到其他办法, 最后只能以正则来匹配QueryString来获得参数了事.

如果这些文字有幸得以被了解问题原因的朋友看到, 还望不吝赐教. 多谢多谢.

[补1]
在和freeman的讨论中发现, 原来escape出来的是%u6211%u662F%u732A, 也就是是unicode, 而urlencode的格式是%hex%hex, 所以有问题. 更要命的事情是escape还和浏览器选择的encode有关! 如果选iso, 则出来的是正确的%h%h的格式, utf-8和gb2312的时候都是unicode的方式. 参考rfc1738

[补2]
Tomcat之类的servlet container的实现里, 都会在getParameter进行解码, 所以类似%u6211%u662F%u732A, 这样的就不能获得了.

[补3, 解决方法]
1. 按照之前我说的那种分析querystring的方法.
2. js的escape以后将%替换成\即%u6211%u662F%u732A, 替换成\u6211\u662F\u732A, 这样能取得.
3. 用js的uft-8的urlencode, 然后http get. urlencode的js可参考这里. (freeman发给我的, 不知出处).

ajaxservletencoding

Random Posts

5 Responses to “the encoding……”

  • freeman Says at January 6th, 2006 2:46 pm :

    是flashsoft同学写的,hehe:
    http://www.fs.org.cn/article.asp?id=7

  • jumpuprundown Says at January 17th, 2006 2:57 pm :

    我的做法是:
    在客户端使用encodeURIComponent()代替escape(),前者总是进行UTF-8编码(或者也可以说UTF-8编码兼容ISO8859-1),这样一来服务器端可以正确接受UTF-8编码的GB2312字符串,在php中,服务器端可以使用iconv或者mbstring接受或者转码。
    而ie的jscript5.5之前不支持encodeURIComponent(),在我的站点里有个方便的ie5.compat.js文件提供这种支持,算法是和楼主的一样的,都是utf16be -> utf8,不过因为只用于提供encodeURIComponent()支持,所以更短些。
    我的blog还没时间打理,代码贴在这里吧:

    [color=#000000][color=#800000][b]if[/b][/color] [color=#0000ff]([/color]typeof encodeURI [color=#0000ff]=[/color][color=#0000ff]=[/color][color=#0000ff]=[/color] [color=#4080ff]’undefined’[/color][color=#0000ff])[/color] [color=#0000ff]{[/color]
    function encodeURI__char[color=#0000ff]([/color]$c[color=#0000ff])[/color]
    [color=#0000ff]{[/color]
    $out [color=#0000ff]=[/color] $c[color=#0000ff].[/color]toString[color=#0000ff]([/color]16[color=#0000ff])[/color][color=#0000ff].[/color]toUpperCase[color=#0000ff]([/color][color=#0000ff])[/color][color=#0000ff];[/color]
    [color=#800000][b]return[/b][/color] [color=#4080ff]’%'[/color] [color=#0000ff]+[/color] [color=#0000ff]([/color]$out[color=#0000ff].[/color]length [color=#0000ff]=[/color][color=#0000ff]=[/color] 1 [color=#0000ff]?[/color] [color=#4080ff]’0′[/color] [color=#0000ff]:[/color] [color=#4080ff]”[/color][color=#0000ff])[/color] [color=#0000ff]+[/color] $out[color=#0000ff];[/color]
    [color=#0000ff]}[/color]

    function encodeURI[color=#0000ff]([/color]$s[color=#0000ff])[/color]
    [color=#0000ff]{[/color]
    var $out [color=#0000ff]=[/color] [color=#4080ff]”[/color][color=#0000ff];[/color]
    [color=#800000][b]for[/b][/color] [color=#0000ff]([/color]var $i [color=#0000ff]=[/color] 0[color=#0000ff],[/color] $c[color=#0000ff];[/color] $i [color=#0000ff][/color][color=#0000ff]=[/color] 0×5b [color=#0000ff]&[/color][color=#0000ff]&[/color] $c [color=#0000ff][/color][color=#0000ff]=[/color] 0×7b [color=#0000ff]&[/color][color=#0000ff]&[/color] $c [color=#0000ff][/color][color=#0000ff]>[/color] 6[color=#0000ff])[/color][color=#0000ff];[/color]
    $out [color=#0000ff]+[/color][color=#0000ff]=[/color] encodeURI__char[color=#0000ff]([/color]0×80 [color=#0000ff]|[/color] $c [color=#0000ff]&[/color] 0×3F[color=#0000ff])[/color][color=#0000ff];[/color]
    [color=#0000ff]}[/color]
    [color=#800000][b]else[/b][/color] [color=#800000][b]if[/b][/color] [color=#0000ff]([/color]$c [color=#0000ff][/color][color=#0000ff]>[/color] 12[color=#0000ff])[/color][color=#0000ff];[/color]
    $out [color=#0000ff]+[/color][color=#0000ff]=[/color] encodeURI__char[color=#0000ff]([/color]0×80 [color=#0000ff]|[/color] $c [color=#0000ff]>[/color][color=#0000ff]>[/color] 6 [color=#0000ff]&[/color] 0×3F[color=#0000ff])[/color][color=#0000ff];[/color]
    $out [color=#0000ff]+[/color][color=#0000ff]=[/color] encodeURI__char[color=#0000ff]([/color]0×80 [color=#0000ff]|[/color] $c [color=#0000ff]&[/color] 0×3F[color=#0000ff])[/color][color=#0000ff];[/color]
    [color=#0000ff]}[/color]
    [color=#800000][b]else[/b][/color] [color=#800000][b]if[/b][/color] [color=#0000ff]([/color]$c [color=#0000ff][/color][color=#0000ff]>[/color] 18[color=#0000ff])[/color][color=#0000ff];[/color]
    $out [color=#0000ff]+[/color][color=#0000ff]=[/color] encodeURI__char[color=#0000ff]([/color]0×80 [color=#0000ff]|[/color] $c [color=#0000ff]>[/color][color=#0000ff]>[/color] 12 [color=#0000ff]&[/color] 0×3F[color=#0000ff])[/color][color=#0000ff];[/color]
    $out [color=#0000ff]+[/color][color=#0000ff]=[/color] encodeURI__char[color=#0000ff]([/color]0×80 [color=#0000ff]|[/color] $c [color=#0000ff]>[/color][color=#0000ff]>[/color] 6 [color=#0000ff]&[/color] 0×3F[color=#0000ff])[/color][color=#0000ff];[/color]
    $out [color=#0000ff]+[/color][color=#0000ff]=[/color] encodeURI__char[color=#0000ff]([/color]0×80 [color=#0000ff]|[/color] $c [color=#0000ff]&[/color] 0×3F[color=#0000ff])[/color][color=#0000ff];[/color]
    [color=#0000ff]}[/color]
    [color=#800000][b]return[/b][/color] $out[color=#0000ff];[/color]
    [color=#0000ff]}[/color]
    [color=#0000ff]}[/color]
    function encodeURIComponent[color=#0000ff]([/color]$s[color=#0000ff])[/color]
    [color=#0000ff]{[/color]
    var $chars [color=#0000ff]=[/color] [color=#0000ff][[/color]0×23[color=#0000ff],[/color] 0×24[color=#0000ff],[/color] 0×26[color=#0000ff],[/color] 0×2b[color=#0000ff],[/color] 0×2c[color=#0000ff],[/color] 0×2f[color=#0000ff],[/color] 0×3a[color=#0000ff],[/color] 0×3b[color=#0000ff],[/color] 0×3d[color=#0000ff],[/color] 0×3f[color=#0000ff],[/color] 0×40[color=#0000ff]][/color][color=#0000ff];[/color]
    $s [color=#0000ff]=[/color] encodeURI[color=#0000ff]([/color]$s[color=#0000ff])[/color][color=#0000ff];[/color]
    [color=#800000][b]for[/b][/color] [color=#0000ff]([/color]var $i [color=#0000ff]=[/color] 0[color=#0000ff];[/color] $i [color=#0000ff]

  • jumpuprundown Says at January 17th, 2006 3:04 pm :

    不好意思,把上面搞乱了,这里有个链接:

  • jumpuprundown Says at January 17th, 2006 3:06 pm :

    更不好意思,这个评论功能“骗人”,不支持<a>
    这是链接:
    http://www.site8.cn/ie5.compat.js

  • Binzy Says at January 21st, 2006 1:22 pm :

    Thanks a lot

Leave a Reply