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

2015-04-02 00:03:22 +08:00
 liemehoc

原始文字为تانزھ,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

2772 次点击
所在节点    问与答
6 条回复
Septembers
2015-04-02 00:20:24 +08:00
liemehoc
2015-04-02 00:48:19 +08:00
@Septembers

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

表单的accept-charset属性为空,应该是继承了页面的编码gbk
liemehoc
2015-04-02 00:51:27 +08:00
非常好奇为什么编码是%xxx这样三位的,网上搜了繁体中文的,是前面两位跟第三位一起编,然后用big5解码,但是这个阿拉伯文的就不知道是怎么弄的了
aaaa007cn
2015-04-03 10:14:54 +08:00
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
2015-04-04 10:44:30 +08:00
@aaaa007cn 抱歉,一直以为gbk和gb18030是一样的,问题解决了,感谢!
liemehoc
2015-04-04 10:56:18 +08:00
@aaaa007cn 确认原表单页为gb18030-_-|||,是我搞混了
链接的资源很给力,收藏了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/180995

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX