Python3 - Chrome 奇怪 url 用 urllib.parse.parse_qs() 解码

Python3 - Chrome weird url decode with urllib.parse.parse_qs()

当我在浏览器 (Chrome) 中提交表单时,我将变音符号“öäü”返回编码为 %F6%E4%FC(我使用的是 POST 请求 [Form submit ] 并从协议主体中获取),尽管如果我在 Python 中执行相同操作,我会得到 %C3%B6%C3%A4%C3%BC.

现在的问题是,如果我取消引用 Python 编码,它可以完美地工作(如预期的那样),但是从浏览器编码失败。

有人知道为什么吗?或者至少向我解释一下? 运行 Python 3.4 Ubuntu.

>>> import urllib.parse
>>> urllib.parse.quote('öäü')
'%C3%B6%C3%A4%C3%BC'
>>> urllib.parse.parse_qs('v=' + _)
{'v': ['öäü']}
>>> urllib.parse.parse_qs('v=' + '%F6%E4%FC') # That encoded String from the Browser
{'v': ['���']}

来自您浏览器的字符串是 latin-1 编码的,urllib.parse 使用 utf-8,如果您使用 latin-1 作为编码,您使用 urllib.parse 获得相同的输出。引用:

In [32]: urllib.parse.quote('öäü',encoding="latin-1")
Out[32]: '%F6%E4%FC'

"FC" 和其他十六进制值是字符的 ISO Latin 1 数值:

In [34]: "\xFC"
Out[34]: 'ü'
In [38]: "\xF6"
Out[38]: 'ö'

要获得正确的输出,您需要指定正确的编码:

In [40]: urllib.parse.parse_qs('v=' + '%F6%E4%FC',encoding="latin-1")
Out[40]: {'v': ['öäü']}

有一个从 U+0000 到 U+00FF 的 utf-8 代码点列表 here, the ISO Latin 1 code are here