繁体   English   中英

Python中的Unicode-仅是UTF-16?

[英]Unicode in Python - just UTF-16?

我在Python世界中感到很高兴,因为当我需要向用户输出某些内容时,我正在使用Unicode并以UTF-8编码进行所有操作。 然后,我的一位同事向我发送了有关UTF-8的这篇文章 ,这让我感到困惑。

本文的作者多次指出UCS-2(Python使用的Unicode表示法)与UTF-16是同义词。 他甚至直接说Python将UTF-16用于内部字符串表示。

作者还承认自己是Windows爱好者和开发人员,并指出MS多年来处理字符编码的方式使该小组最困惑,所以也许这只是他自己的困惑。 我不知道...

有人可以解释一下Python中UTF-16与Unicode的状态是什么吗? 它们是同义词吗?如果不是,则以什么方式?

Python中Unicode字符串(从2.2到3.2的版本)的内部表示形式取决于Python是在模式还是模式下编译的。 大多数Python版本都是狭窄的(您可以使用sys.maxunicode进行检查-狭窄版本为65535,宽版本为1114111)。

对于广泛的构建,字符串在内部是4字节宽字符的序列,即,它们使用UTF-32编码。 所有代码点的长度正好是一个宽字符。

对于狭窄的构建,字符串是使用UTF-16在内部由2个字节宽的字符组成的序列。 BMP以外的字符(代码点U + 10000及以上)使用通常的UTF-16代理对存储:

>>> q = u'\U00010000'
>>> len(q)
2
>>> q[0]
u'\ud800'
>>> q[1]
u'\udc00'
>>> q
u'\U00010000'

请注意,UTF-16和UCS-2不相同。 UCS-2是固定宽度的编码:每个代码点编码为2个字节。 因此,UCS-2 无法编码超出BMP的代码点。 UTF-16是可变宽度编码; BMP外部的代码点使用一对称为代理对的字符进行编码。


请注意,随着PEP 393的实施,所有这些都在3.3中进行了更改。 现在,Unicode字符串使用足以容纳最大代码点的字符来表示-ASCII字符串为8位,BMP字符串为16位,否则为32位。 当使用许多仅ASCII的字符串时,这消除了宽/窄分隔,还有助于减少内存使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM