[英]How do I check whether have encoded in utf-8 successfully
給定一個字符串
u ='abc'
哪種語法適合編碼為utf8?
u.encode('utf-8')
要么
u.encode('utf8')
我怎么知道我已經用utr-8編碼了?
首先,如果要談論Python 2或Python 3,則需要區別對待,因為Unicode處理是兩個版本之間最大的區別之一。
unicode
類型包含文本字符 str
包含8位字節的序列,有時以某些未指定的編碼表示文本 s.decode(encoding)
接受一個序列字節,並在給定字節使用的編碼后從其構建文本字符串。 它從str
到unicode
,例如"Citt\\xe0".decode("iso8859-1")
將為您提供文本“Città”(意大利語為城市), "Citt\\xc3\\xa0".decode("utf-8")
也會出現同樣的情況"Citt\\xc3\\xa0".decode("utf-8")
。 可以省略編碼,在這種情況下,含義是“使用默認編碼”。 u.encode(encoding)
接受一個文本字符串,並以給定的編碼方式構建表示該字符串的字節序列,從而逆轉了decode
的處理。 它從unicode
到str
。 如上所述,可以省略編碼。 使用Python處理unicode時,造成混淆的部分原因是該語言試圖變得有點聰明,並且會自動執行操作。
例如,你可以調用encode
也是對str
對象和意思是“編碼使用默認的編碼時,最終使用指定的編碼或者未指定默認的編碼,從這些字節解碼自帶的文本”。
同樣,您也可以在unicode
對象上調用decode
,意思是“使用默認編碼,最終使用指定的編碼,解碼來自此文本的字節”。
例如,如果我寫
u"Citt\u00e0".decode("utf-8")
Python給出錯誤:
UnicodeEncodeError:'ascii'編解碼器無法在位置3處編碼字符u'\\ xe0':序數不在范圍內(128)
注意:錯誤是關於編碼失敗,而我要求解碼 。 原因是我要求解碼文本(廢話,因為它已經被“解碼”了……它是文本),Python決定先使用“ ascii”編碼對它進行編碼,但失敗了。 更好的是,IMO不必對Unicode對象進行decode
,而不必對字符串對象encode
:錯誤消息會更清晰。
更令人困惑的是,在Python 2中, str
用於未編碼的字節 ,但是它也用於文本,例如字符串文字是str
對象。
為了解決某些問題,Python 3進行了一些關鍵更改
str
用於文本,包含unicode字符,字符串文字是unicode文本 unicode
類型不再存在 bytes
類型用於8位字節序列,這些序列可能以某些未指定的編碼表示文本 例如在Python 3中
'Città'.encode('iso8859-1') → b'Citt\xe0'
'Città'.encode('utf-8') → b'Citt\xc3\xa0'
同樣,您不能對文本字符串調用decode
,也不能對字節序列調用encode
。
有時,將文本編碼為字節可能會失敗,因為指定的編碼無法處理所有unicode。 例如iso8859-1
無法處理中文。 這些錯誤可以通過幾種方式處理,例如引發異常(默認)或替換無法用其他方式編碼的字符。
但是,編碼utf-8
能夠編碼任何unicode字符,因此編碼為utf-8
絕不會失敗。 因此,問如何知道將文本編碼為utf-8
是否正確是沒有意義的,因為它總是會發生(對於utf-8
)。
解碼也可能失敗,因為在指定的編碼中字節序列可能沒有意義。 例如,字節0x43 0x69 0x74 0x74 0xE0
的序列不能解釋為utf-8
因為沒有適當的前綴就不能出現字節0xE0
。
像iso8859-1
這樣的編碼,但是解碼不會失敗,因為任何字節0..255都具有字符含義。 大多數“本地編碼”都是這種類型的...它們將所有256個可能的8位值映射到某個字符,但只覆蓋了unicode字符的一小部分。
使用iso8859-1
解碼將永遠不會引發錯誤(任何字節序列均有效),但如果字節使用其他編碼,則當然可以為您提供無用的文本。
第一個解決方案:
isinstance(u, unicode)
第二種解決方案:
try:
u.decode('utf-8')
print "string is UTF-8, length %d bytes" % len(string)
except UnicodeError:
print "string is not UTF-8"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.