sys.maxunicode是什么意思?
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
来转换这些不同的形式。