[英]How do I print a list of strings, when I can't know the char encoding in advance?
我正在使用我用Python編寫的客戶端從Web服務中檢索名稱列表。 檢索列表后,我將每個名稱編碼為unicode,然后將每個名稱打印到stdout。 當我獲得名稱“ÓlafurJóhannÓlafsson”時,出現以下錯誤:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)
由於我不知道編碼是什么,如何將所有這些字符串轉換為unicode? 還是可以建議一種更好的方法來解決此問題?
BeautifulSoup
的UnicodeDammit
模塊可以自動檢測編碼。
from BeautifulSoup import UnicodeDammit
u = UnicodeDammit("Ólafur Jóhann Ólafsson")
print u.unicode
print u.originalEncoding
此頁面可能會幫助您http://wiki.python.org/moin/PrintFails
我想問題是您需要打印這些名稱以進行控制台。 您真的需要嗎? 還是只是一個測試環境? 如果您僅使用控制台進行測試,則可以切換到其他工具(例如單元測試)來檢查您究竟獲得了什么值。
首先,從文件,管道,套接字,終端等讀取數據時, 將數據解碼為Unicode( 無編碼)。 並在發送/保留數據時將Unicode 編碼為適當的字節編碼。 我懷疑這是您問題的根源。
Web服務應在標頭或接收到的數據中聲明編碼。 print
正常情況下, print
會自動將Unicode編碼為終端的編碼(通過sys.stdout.encoding
發現),或者在沒有ascii
情況下自動將其編碼。 如果目標編碼不支持數據中的字符,則會收到UnicodeEncodeError
。
由於這不是您收到的錯誤,因此您應該發布一些代碼,以便我們可以看到您在做什么。 最有可能的是,您正在編碼一個字節字符串,而不是進行解碼 。 這是一個例子:
>>> data = '\xc2\xbd' # UTF-8 encoded 1/2 symbol.
>>> data.encode('cp437')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\dev\python\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
我在這里所做的是在字節字符串上調用encode
。 由於encode
需要Unicode字符串,因此Python使用默認的ascii
編碼先將字節字符串解碼為Unicode,然后再編碼為cp437
。
通過解碼而不是對數據進行編碼來解決此問題,然后print
將自動編碼為stdout。 只要您的終端支持數據中的字符,它將正確顯示:
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> print data.decode('utf8') # implicit encode to sys.stdout.encoding
½
>>> print data.decode('utf8').encode('cp437') # explicit encode.
½
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.