2015-03-19 206 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