Python3 - Chrome 奇怪的 urldecode 与 urllib.parse.parse_qs()

标签 python parsing python-3.x decode python-3.4

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

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

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

>>> 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.quote 会得到相同的输出:

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 here 的 utf-8 代码点列表,ISO Latin 1 代码为 here

关于Python3 - Chrome 奇怪的 urldecode 与 urllib.parse.parse_qs(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31105422/

相关文章:

php - 在 PHP 或 jQuery 中将文本解析为数组

c++ - 用 boost spirit 解析交错行

python-3.x - python 3 : how to install pygame?

python - 如何保存 nltk FreqDist 图?

python - 用于 Python 的 RPC 库

python - 优雅的解析这个? "a,b,c",d ,"e,f"

python-3.x - Selenium 通过 xpath 查找元素并单击

Python-Youtube-Api : Missing code parameter in response

python - Python 3 中是否有比 bytes(str(some_variable), 'utf-8' ) 更短或更快的替代方案?

java - NLTK 找不到 Java 可执行文件