2015-03-19 203 views
0

我有一個UTF8字符串管道從Java到Python。UTF8 python編碼和解碼

最終的結果是

'\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'\u0e1a\u0e19'

如果我是編碼(u'\u0e1a\u0e19')我還是會回到'\xe0\xb8\x9a\xe0\xb8\x99'.

那麼究竟是什麼這兩個怎麼我的確瞭解什麼時候使用解碼和編碼之間的固有差異。

回答

2

UTF8字符串不足以描述語句'\xe0\xb8\x9a\xe0\xb8\x99'是;它確實應該被稱爲Unicode字符串的UTF8編碼。

Python 2中的unicode類型和Python 3的str類型表示的unicode的代碼點的字符串,所以該語句u'\u0e1a\u0e19'是兩個代碼點U+0E1A U+0E19的蟒表示和對人類而言,將被呈現爲บน

至於解釋整個encodedecode調用,我們將使用你的例子。從Java返回的是一串原始字節,因此爲了使其作爲人類文本有用,您需要將decode'\xe0\xb8\x9a\xe0\xb8\x99'作爲utf-8編碼的輸入,以便讓它回到它們表示的unicode代碼點(它是u'\u0e1a\u0e19') 。在該字符串的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的原因之一,因爲這些字節'\xba\xb9'可以使用iso8859-1編碼進行解碼,該編碼將被呈現爲º¹iso8859-11作爲บน

簡而言之,'\xe0\xb8\x9a\xe0\xb8\x99'是Python語法中用於u'\u0e1a\u0e19'的unicode代碼點的UTF8編碼。原始字節(通過線路傳輸,從文件讀取)通常不是unicode代碼點的形式,它們必須解碼爲unicode代碼點。 Unicode代碼點不是一種編碼,當通過網絡發送(或寫入文件)時,必須將代碼編碼爲某種類型的Unicode代碼點的字節表示,在許多情況下它們都是utf-8,因爲它具有最大的可移植性。

最後,你應該閱讀:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

2

'\ 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表示這兩種概念之間的映射方式。

這有幫助嗎?

+1

..甚至「二百二十四」是二進制表示11100000的*十進制表示*,它僅僅是一些電子被推過某些摻雜硅的二進制表示*,它只是一個*標準模型表示*我們對亞原子粒子有些微弱的理解,這是弦理論的東西。 – roippi 2015-03-19 01:30:05

+0

@Malvolio那麼我什麼時候使用解碼和編碼?說我要寫這個字符串到一個文件。我是否需要將u'\ u0e1a \ u0e19編碼爲UTF8或將文件寫入\ xe0 \ xb8 \ x9a \ xe0 \ xb8 \ x99文件中顯示文件 – aceminer 2015-03-19 01:30:30

+0

@aceminer中相應的UTF8字符บน我將我的答案顯着擴展到回答你的問題。 – metatoaster 2015-03-19 01:38:38