Python中的Unicode
在Python 2.7的文档中,有三条关于Unicode的规则,简单来说就是:
如果代码点小于128,它就用对应的字节值表示。
如果代码点在128到
0x7ff
之间,它会变成两个字节值,这两个值在128到255之间。如果代码点大于
0x7ff
,它会变成三个或四个字节的序列,每个字节的值也在128到255之间。
然后我做了一些测试:
>>>> unichr(40960)
u'\ua000'
>>> ord(u'\ua000')
40960
在我看来,40960是一个大于0x7ff
的代码点,所以它应该变成三个或四个字节的序列,每个字节的值在128到255之间,但它却只变成了两个字节的序列,而且在u'\a000'中出现的'00'的值小于128,这和上面提到的规则不符。为什么会这样呢?
更有意思的是,我发现了一些其他的Unicode字符,比如u'\u1234'
等。我发现它里面的值("12"和"34")也小于128,但根据之前提到的理论,它们不应该小于128。我是不是漏掉了什么理论呢?
谢谢大家的回答。
3 个回答
这些规则只适用于UTF-8编码。Python内部使用的是UCS-2或UCS-4,这两种编码的字符大小是固定的。
“每个软件开发者绝对、肯定必须了解的关于Unicode和字符集的最低限度知识(没有借口!)”
... 而u'\a000'中的值'00'小于128,这和上面提到的规则不匹配。
我甚至不想知道你为什么会觉得它们可以这样分开...
你提到的内容显然来自于Unicode HOWTO(你最好能告诉我们这个信息的来源,最好附上链接),它描述的是UTF-8的情况。实际上,它并没有说这是Python 2.7如何表示Unicode字符的,反而是说了相反的内容:
在内部,Python将Unicode字符串表示为16位或32位的整数,这取决于Python解释器是如何编译的。
在Python 2.7的文档中,有关于Unicode的三个规则,描述如下:
这其实是在讲UTF-8编码。
然后我做了一些测试:
\ua000
是一个转义序列,用来表示一个Unicode字符。这里的 a000
是这个字符的数字编码值的十六进制表示。它和 UTF-8编码没有关系。
当你明确地使用UTF-8编码来编码一个Unicode字符串时,才会得到UTF-8编码。