将非ascii字符分配给python内置字符串时,该值意味着什么?

时间:2017-01-06 02:47:03

标签: python string unicode encoding utf-8

我最近正在研究与编码相关的内容,我对以下内容感到困惑:

看我有没有

a = "哈"  ## whatever non-ascii char is fine
a[0] ## = "\xe5"
a[1] ## = "\x93"
a[2] ## = "\x88"

len(a)将为3,每个值都为&#34; \ xe5&#34;,&#34; \ x93&#34;和&#34; \ x88&#34; < / p>

我理解,如果我这样做:

a.decode("utf-8") ## = u"\u54c8"

它将成为一个unicode字符串,代码点将是&#34; \ u54c8&#34;。 问题是:内置python字符串使用什么编码方法? 为什么[0]不是&#34; \ x54&#34;和[1]不是&#34; \ xc8&#34;所以他们在一起是&#34; 54c8&#34;?

我猜内置python str中的编码不应该是utf-8,因为正确的utf-8代码点应该是&#34; \ u54c8&#34;。是吗?

2 个答案:

答案 0 :(得分:1)

UTF-8和Unicode不是一回事。 Unicode是整数值到字符的抽象映射; UTF-8是一种将这些整数表示为字节序列的特殊方式。 \xe5\x93\x88是整数0x54c8的三字节UTF-8编码,不能用单个字节表示。

Python 2中的默认编码是ISO-8859,但在Python 3中已更改为UTF-8。

答案 1 :(得分:1)

将非ascii字符粘贴到解释器中的结果取决于您的终端编码。可能(从查看您的数据)在您的终端上进行utf-8编码。

a = "哈"

在Python 2交互式解释器中评估该行代码时,您将创建已编码的字节串对象。

要从中获取文本对象,您必须使用以下方法解码数据:

a.decode(encoding)

总是将str对象视为 bytes ,将unicode对象视为 text

代码点和utf-8编码字节之间没有简单的关系。 简单的关系是

u'哈' == u'\u54c8' == unichr(21704)

将代码点视为大表中的索引,您可以使用该表来查找该索引处的字符。上面的相等只是表明哈是代码点21704的字符(因为在十六进制中,0x54c8是21704)。

如果你想知道代码点(21704)和UTF字节(\ xe5和\ x93东西)之间的关系,我已经写了一篇关于ruby's operators precedence的长答案。如果您有兴趣了解如何手动编码/解码UTF,您可以阅读它。