[英]UTF8 Encoding and decoding in python
我有一個從Java傳遞到python的UTF8字符串。
最終結果是
'\xe0\xb8\x9a\xe0\xb8\x99'
因此,例如
a = '\xe0\xb8\x9a\xe0\xb8\x99'
a.decode('utf-8')
給我結果
u'\u0e1a\u0e19'
但是,我很好奇的是,因為字節是以UTF-8的形式傳遞的,為什么會這樣
'\xe0\xb8\x9a\xe0\xb8\x99'
而不是u'\บ\น'
。
如果我要編碼(u'\บ\น')
我會返回'\\xe0\\xb8\\x9a\\xe0\\xb8\\x99'.
那么這兩者之間的內在區別是什么,以及我實際上如何理解何時使用解碼和編碼。
UTF8字符串不足以描述語句'\\xe0\\xb8\\x9a\\xe0\\xb8\\x99'
是; 它實際上應該稱為Unicode字符串的UTF8編碼。
Python 2的unicode
類型和Python 3的str
類型表示一串unicode代碼點,因此語句u'\บ\น'
是兩個代碼點U+0E1A U+0E19
的python表示,按人類的說法,它將被呈現作為บน
。
至於解釋整個encode
和decode
調用,我們將使用您的示例。 你從Java回來是原始字節流,並因此使其為人類的文字有用,您還需要decode
'\\xe0\\xb8\\x9a\\xe0\\xb8\\x99'
為utf-8
以編碼輸入到返回到它們代表的unicode代碼點(即u'\บ\น'
)。 在該串unicode代碼字符串上調用encode
返回一個字節列表(在Python 2中它將是str
類型,而在Python 3中它將實際上是bytes
類型)將返回到一系列字節'\\xe0\\xb8\\x9a\\xe0\\xb8\\x99'
。
當然,您可以將這些unicode代碼點編碼為其他編碼,例如UTF16編碼,在小端字節序平台上,它將導致字節'\\xff\\xfe\\x1a\\x0e\\x19\\x0e'
,或使用將這些代碼點編碼為非Unicode編碼。 因為看起來像泰語,我們可以為此使用iso8859-11
編碼,它將被編碼為字節'\\xba\\xb9'
但這不是跨平台的,因為它將僅在為此特定配置的系統上顯示為泰語編碼。 這是發明Unicode的原因之一,因為可以使用iso8859-1
編碼將這些字節'\\xba\\xb9'
解碼,該編碼將被表示為º¹
或iso8859-11
為บน
。
簡而言之, '\\xe0\\xb8\\x9a\\xe0\\xb8\\x99'
是Python語法中u'\บ\น'
的Unicode代碼點的UTF8編碼。 原始字節(通過電線傳來,從文件中讀取)通常不采用unicode代碼點的形式,必須將其解碼為unicode代碼點。 Unicode代碼點不是一種編碼,並且當通過網絡發送(或寫入文件)時,必須將其編碼為unicode代碼點的某種字節表示形式,在許多情況下為utf-8,因為它具有最大的可移植性。
最后,您應該閱讀以下內容: 每個軟件開發人員絕對,肯定地必須絕對了解Unicode和字符集(沒有任何借口!)
'\\ xe0 \\ xb8 \\ x9a \\ xe0 \\ xb8 \\ x99'只是一系列字節。 您已選擇將其解釋為UTF-8,然后將其解碼為一系列unicode字符U + e1a和U + e19。
序列U + e1a,U + e19可以表示為u'\\ u0e1a \\ u0e19',但從某種意義上說,表示形式與'\\ xe0 \\ xb8 \\ x9a \\ xe0 \\ xb8 \\ x99'一樣。 這是“自然的”,這就是Python以這種方式打印它們的原因,但是效率低下,這就是為什么還有其他各種編碼方案(包括UTF-8)的原因
實際上,說“'\\ xe0 \\ xb8 \\ x9a \\ xe0 \\ xb8 \\ x99'是一系列字節”對我來說有點誤導。 它是一系列字節的默認表示形式 ,即二十四字節,然后是一百八十四,依此類推。
Python具有一系列字節的概念,並且具有一系列Unicode字符的單獨概念。 encode
和decode
代表了這兩個概念之間映射的一種方式。
有幫助嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.