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
当我在浏览器 (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