6

下面是一个简单的测试。repr似乎工作正常。然而lenx 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']

好消息是 Python 3.3 做了正确的事™。

Python 2.x 系列还有希望吗?

4

1 回答 1

11

是的,只要你编译你的 Python 并支持广泛的 unicode。

默认情况下,Python 仅使用窄 unicode 支持构建。通过以下方式启用广泛支持:

./configure --enable-unicode=ucs4

您可以通过测试验证使用了什么配置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'

广泛的构建将对所有unicode 值使用 UCS4 字符,从而使这些值的内存使用量增加一倍。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']
于 2013-10-15T18:33:45.393 回答