Python3 - 使用urllib.parse.parse_qs()进行Chrome奇怪的url解码

时间:2015-06-28 22:30:31

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

当我在浏览器(Chrome)中提交表单时,我将变音符号“öäü”反编码为seen = set() duplicates = set() for path, dir, files in os.walk(Working_Dir): for xml in files: xmlName = xml.split('.')[1] if xmlName in seen: duplicates.add(xmlName) seen.add(xmlName) (我正在使用POST请求[表单提交]并从协议正文中获取),虽然如果我在Python中做同样的事情,我会得到%F6%E4%FC

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

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

%C3%B6%C3%A4%C3%BC

1 个答案:

答案 0 :(得分:1)

您的浏览器中的字符串是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