Python中的Unicode

-1 投票
3 回答
1259 浏览
提问于 2025-04-17 07:06

在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 个回答

2

这些规则只适用于UTF-8编码。Python内部使用的是UCS-2或UCS-4,这两种编码的字符大小是固定的。

“每个软件开发者绝对、肯定必须了解的关于Unicode和字符集的最低限度知识(没有借口!)”

... 而u'\a000'中的值'00'小于128,这和上面提到的规则不匹配。

我甚至不想知道你为什么会觉得它们可以这样分开...

3

你提到的内容显然来自于Unicode HOWTO(你最好能告诉我们这个信息的来源,最好附上链接),它描述的是UTF-8的情况。实际上,它并没有说这是Python 2.7如何表示Unicode字符的,反而是说了相反的内容:

在内部,Python将Unicode字符串表示为16位或32位的整数,这取决于Python解释器是如何编译的。

5

在Python 2.7的文档中,有关于Unicode的三个规则,描述如下:

这其实是在讲UTF-8编码。

然后我做了一些测试:

\ua000 是一个转义序列,用来表示一个Unicode字符。这里的 a000 是这个字符的数字编码值的十六进制表示。它 UTF-8编码没有关系

当你明确地使用UTF-8编码来编码一个Unicode字符串时,才会得到UTF-8编码。

撰写回答