簡體   English   中英

當我事先不知道char編碼時,如何打印字符串列表?

[英]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? 還是可以建議一種更好的方法來解決此問題?

BeautifulSoupUnicodeDammit模塊可以自動檢測編碼。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM