簡體   English   中英

python中的UTF8編碼和解碼

[英]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表示,按人類的說法,它將被呈現作為บน

至於解釋整個encodedecode調用,我們將使用您的示例。 你從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字符的單獨概念。 encodedecode代表了這兩個概念之間映射的一種方式。

有幫助嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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