[英]Python: open a URL with accent
在Python 2.7中,我想打開一個包含重音符號的URL( 鏈接本身 ,而不是它指向的頁面)。 如果我使用以下內容:
#!/usr/bin/env Python
# -*- coding: utf-8 -*-
import urllib2
test = "https://www.notifymydevice.com/push?ApiKey=K6HGFJJCCQE04G29OHSRBIXI&PushTitle=Les%20accents%20:%20éèçà&PushText=Messages%20éèçà&"
urllib2.urlopen(test)
我的口音轉換為胡言亂語(Ã,¨,©等,而不是我期望的éèà)。
我已經搜索過此類問題,因此嘗試使用urllib2.urlopen(test.encode('utf-8')),但Python在這種情況下會引發錯誤:
urllib2.urlopen(test.encode('utf8'))中的文件“ test.py”,第10行,UnicodeDecodeError:“ ascii”編解碼器無法解碼位置98的字節0xc3:序數不在范圍內(128)
用u
前綴字符串。 我沒有錯誤嘗試使用repl
import urllib
test = u'https://www.notifymydevice.com/push?ApiKey=K6HGFJJCCQE04G29OHSRBIXI&PushTitle=Les%20accents%20:%20éèçà&PushText=Messages%20éèçà&'
urllib.urlopen(test.encode("UTF-8"))
u
前綴用於unicode字符串
如果你調用encode
一個str
,Python有先譯碼后, unicode
,因此它可以編碼統一為UTF-8。 為了解碼它,它必須猜測您使用了哪種編碼,因為您沒有告訴它。 因此,它猜測為'ascii'
(實際上,它猜測sys.getdefaultencoding()
所說的內容,但這通常是'ascii'
),但失敗了。
無論如何,這里有兩個可能的問題,有不同的解決方案。 因此,在嘗試修復該問題之前,您需要先確定自己擁有哪一個。
嘗試打印出字符串的各個字節,或更簡單地說,是repr
:
print repr(test)
é
顯示為\\xc3\\xa9
, \\xc3\\xa9
UTF-8。 \\xe9
, \\xe9
Latin-1(或cp1252或與Latin-1兼容的其他名稱)。 如果您要提供Python Latin-1源碼並告訴它是UTF-8,它不會發牢騷,但這意味着您將在您認為自己正在發送UTF-8字符的地方發送Latin-1字節,並且到處都會得到mojibake。
解決方法是在文本編輯器中將源代碼另存為UTF-8。
如果已經是 UTF-8,則問題在於服務器不希望URL為UTF-8。
URL標准對( %
編碼的)非ASCII字節沒有強制要求任何特殊含義; 任何服務器都可以對它們執行任何操作。 而且,如果您正在與將此類字節視為cp1252的服務器進行通信,但要發送的是UTF-8,則將獲得mojibake。
解決此問題的方法是,如果您控制服務器,則將服務器重新配置為處理UTF-8,如果不需要,則以服務器所需的字符集發送字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.