sys.maxunicode是什么意思?

7 投票
1 回答
3761 浏览
提问于 2025-04-17 02:44

CPython内部将unicode字符串存储为utf-16或utf-32,这取决于编译时的选项。在使用utf-16构建的Python中,字符串切片、迭代和len函数似乎是针对代码单元(code units)而不是代码点(code points)进行操作的,因此多字节字符的表现会有些奇怪。

举个例子,在CPython 2.6中,sys.maxunicode的值是65535:

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

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

这是否意味着在sys.maxunicode之外的unicode操作不一定能正常工作?如果我想处理超出基本多语言平面(BMP)的字符,我就必须使用utf-32版本,或者自己编写可移植的unicode操作吗?

我在如何在Python 3中迭代Unicode字符?这个问题中遇到了这个问题。

1 个回答

5

sys.maxunicode=65535这个范围之外的字符,会使用UTF-16代理对的方式在内部存储。也就是说,你需要自己处理这个问题,或者使用一个宽字符集的版本。即使是使用了宽字符集的版本,你也可能需要处理一些字符,它们是由多个代码点组合而成的。例如:

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

第一个例子使用了一个组合的重音符号,而第二个则没有。虽然它们的显示效果是一样的,但实际上是不同的。你可以使用unicodedata.normalize来转换这些不同的形式。

撰写回答