CPython根据编译选项在内部将Unicode字符串存储为utf-16或utf-32。在utf-16中,Python字符串 slice ,迭代和len似乎适用于代码单元,而不是代码点,因此多字节字符的行为异常。

例如,在sys.maxunicode = 65535的CPython 2.6上:

>>> char = u'\U0001D49E'
>>> len(char)
2
>>> char[0:1]
u'\uu835'
>>> char[1:2]
u'\udc9e'

根据Python文档, sys.maxunicode 是“一个为Unicode字符提供最大支持代码点的整数”。

这是否意味着不保证unicode操作不能用于sys.maxunicode以外的代码点?如果要使用BMP之外的字符,我是否必须使用utf-32构建或编写自己的可移植unicode操作?

我在How to iterate over Unicode characters in Python 3?中遇到了这个问题

最佳答案

超出sys.maxunicode=65535的字符使用UTF-16代理在内部存储。是的,您必须自己解决这个问题或使用广泛的构建。即使使用广泛的版本,您也可能必须处理由代码点组合表示的单个字符。例如:

>>> print('a\u0301')
á
>>> print('\xe1')
á

第一个不使用重音符号,第二个不使用。两者打印相同。您可以使用unicodedata.normalize转换表单。

08-28 06:41