考虑以下关于 IPython 的交流:
In [1]: s = u'華袞與緼同歸'
In [2]: len(s)
Out[2]: 8
正确的输出应该是7
,但是因为这七个汉字中的第五个具有高 Unicode 代码点,所以它在 UTF-8 中由“代理对”表示,而不仅仅是一个简单的代码点,因此 Python认为它是两个字符而不是一个字符。
即使我使用unicodedata
,它将代理对正确地作为单个代码点(\U00026177
)返回,当传递给len()
错误的长度时仍然返回:
In [3]: import unicodedata
In [4]: unicodedata.normalize('NFC', s)
Out[4]: u'\u83ef\u889e\u8207\u7dfc\U00026177\u540c\u6b78'
In [5]: len(unicodedata.normalize('NFC', s))
Out[5]: 8
如果不采取像为 UTF-32 重新编译 Python 这样的激烈步骤,有没有一种简单的方法可以在这种情况下获得正确的长度?
我在 IPython 0.13、Python 2.7.2、Mac OS 10.8.2 上。