我最近正在研究与编码相关的内容,我对以下内容感到困惑:
看我有没有
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;。是吗?
答案 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,您可以阅读它。