繁体   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