簡體   English   中英

如何檢查是否已成功在utf-8中進行編碼

[英]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處理是兩個版本之間最大的區別之一。

Python 2

  • unicode類型包含文本字符
  • str包含8位字節的序列,有時以某些未指定的編碼表示文本
  • s.decode(encoding)接受一個序列字節,並在給定字節使用的編碼后從其構建文本字符串。 它從strunicode ,例如"Citt\\xe0".decode("iso8859-1")將為您提供文本“Città”(意大利語為城市), "Citt\\xc3\\xa0".decode("utf-8")也會出現同樣的情況"Citt\\xc3\\xa0".decode("utf-8") 可以省略編碼,在這種情況下,含義是“使用默認編碼”。
  • u.encode(encoding)接受一個文本字符串,並以給定的編碼方式構建表示該字符串的字節序列,從而逆轉了decode的處理。 它從unicodestr 如上所述,可以省略編碼。

使用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

為了解決某些問題,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.

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