python是否支持超出基本多语言平面的unicode?

Dim*_*nek 5 python unicode python-2.7

以下是一个简单的测试.repr似乎工作正常.然而len,x for x in似乎并没有在Python 2.6和2.7中正确划分unicode文本:

In [1]: u""
Out[1]: u'\U0002f920\U0002f921'

In [2]: [x for x in u""]
Out[2]: [u'\ud87e', u'\udd20', u'\ud87e', u'\udd21']
Run Code Online (Sandbox Code Playgroud)

好消息是Python 3.3做正确的事情™.

Python 2.x系列有什么希望吗?

Mar*_*ers 10

是的,前提是您使用wide-unicode支持编译Python.

默认情况下,Python仅使用窄的unicode支持构建.启用广泛支持:

./configure --enable-unicode=ucs4
Run Code Online (Sandbox Code Playgroud)

您可以通过测试验证使用的配置sys.maxunicode:

import sys
if sys.maxunicode == 0x10FFFF:
    print 'Python built with UCS4 (wide unicode) support'
else:
    print 'Python built with UCS2 (narrow unicode) support'
Run Code Online (Sandbox Code Playgroud)

宽版本将使用UCS4字符表示所有 unicode值,使这些值的内存使用量增加一倍.Python 3.3切换到可变宽度值; 只有足够的字节用于表示当前值中的所有字符.

快速演示,显示宽版本正确处理您的示例Unicode字符串:

$ python2.6
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.maxunicode
1114111
>>> [x for x in u'\U0002f920\U0002f921']
[u'\U0002f920', u'\U0002f921']
Run Code Online (Sandbox Code Playgroud)

  • @qarma:Python 3.3完全消除了窄与宽,所以`sys.maxunicode`在那里硬编码为0x10ffff.OS X捆绑的Python版本都很窄. (4认同)