2015-06-28 33 views
1

當我提交表單在瀏覽器(鉻),我得到的變音器「öäü」回編碼爲%F6%E4%FC(我正在使用POST請求[表單提交]並從協議主體中獲得),但如果我在Python中執行相同的操作,則會得到%C3%B6%C3%A4%C3%BCPython3 - 鉻怪異的URL解碼與urllib.parse.parse_qs()

現在的問題是,如果我取消引用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': ['���']} 
+0

是的! o-o但爲什麼是Latin-1? – max

+0

'hex'E4'==ä','hex F6 ==ö','hex'FC'==ü',它們是這些字符的iso latin-1數字值http://www.ic.unicamp .BR /〜斯托爾菲/導出/ WWW/ISO-8859-1-Encoding.html –

回答

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拉丁文字符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 UTF-8代碼點U + 00FF here的列表中,ISO拉丁1碼是here