V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
liemehoc
V2EX  ›  问与答

GBK 环境下阿拉伯文字的 urlencode 问题

  •  1
     
  •   liemehoc · 2015-04-02 00:03:22 +08:00 · 2872 次点击
    这是一个创建于 3542 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原始文字为تانزھ,UTF-8编码

    表单页编码为GBK(这个没法改),原始文字通过表单页提交后被浏览器编码为%811%842%811%839%811%870%811%850%811%930
    (这是什么鬼- -b)

    用python的urllib.quote试着编码了一下,结果是%D8%AA%D8%A7%D9%86%D8%B2%DA%BE
    (这个跟utf-8编码的表单页提交的编码结果是一样的)

    GBK环境的编码规则是怎么样的(GBK没法编阿拉伯文字),如何用python模拟实现

    *浏览器为FF30 & IE9,win7
    *python版本为2.7.3,linux

    6 条回复    2015-04-04 10:56:18 +08:00
    liemehoc
        2
    liemehoc  
    OP
       2015-04-02 00:48:19 +08:00
    @Septembers

    escape('تانزھ');
    "%u062A%u0627%u0646%u0632%u06BE"

    表单的accept-charset属性为空,应该是继承了页面的编码gbk
    liemehoc
        3
    liemehoc  
    OP
       2015-04-02 00:51:27 +08:00
    非常好奇为什么编码是%xxx这样三位的,网上搜了繁体中文的,是前面两位跟第三位一起编,然后用big5解码,但是这个阿拉伯文的就不知道是怎么弄的了
    aaaa007cn
        4
    aaaa007cn  
       2015-04-03 10:14:54 +08:00   ❤️ 1
    gbk 根本就无法直接编码阿拉伯文字
    https://html.spec.whatwg.org/multipage/forms.html#url-encoded-form-data
    按照标准
    在 gbk 编码下提交时
    浏览器应该先把“تانزھ”转换成“&#数值;”的形式
    然后再编码成 %26%231578%3B%26%231575%3B%26%231606%3B%26%231586%3B%26%231726%3B

    ت
    => 0x062A(1578) => ت => %26%231578%3B

    但是
    这些字符却可以在 gb18030 下进行编码
    也就是你看到的 %811%842%811%839%811%870%811%850%811%930
    或者更确切地表示为 %81%31%84%32%81%31%83%39%81%31%87%30%81%31%85%30%81%31%93%30
    每个字符对应 4 个字节,比如
    ت
    => 0x062A => \x81\x31\x84\x32 => %81%31%84%32 => %811%842

    至于 python 2
    urllib.quote 其实只接受字节串
    尝试以 gbk 编码将报 UnicodeEncodeError 错误
    只能编码为 gb18030
    正确的写法应当是
    urllib.quote(u'\u062A\u0627\u0646\u0632\u06BE'.encode('gb18030'))
    urllib.quote(u'تانزھ'.encode('gb18030')) # 如果你的文件编码为 utf-8
    urllib.quote('تانزھ'.decode('utf-8').encode('gb18030')) # 如果你的文件编码为 utf-8
    urllib.quote('تانزھ') # 如果你的文件编码为 gb18030

    所以你是怎么在表单页编码为 gbk 时观察到编码为 gb18030 才会有的编码结果的 -_-|||
    liemehoc
        5
    liemehoc  
    OP
       2015-04-04 10:44:30 +08:00
    @aaaa007cn 抱歉,一直以为gbk和gb18030是一样的,问题解决了,感谢!
    liemehoc
        6
    liemehoc  
    OP
       2015-04-04 10:56:18 +08:00
    @aaaa007cn 确认原表单页为gb18030-_-|||,是我搞混了
    链接的资源很给力,收藏了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:13 · PVG 22:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.