2013-10-15 27 views
5

下面是一個簡單的測試。 repr似乎工作正常。但lenx for x in似乎並沒有對Unicode文本在Python 2.6和2.7正確劃分:python是否支持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系列有沒有希望?

回答

10

是的,只要你編譯你的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' 

廣泛的構建將使用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'] 
+1

哪種編碼不使用3.3? –

+1

@DavidHeffernan:參見[PEP 393](http://docs.python.org/3/whatsnew/3.3.html#pep-393);直到UCS4,如果所有字符的2個LSB字節都爲0,則下降到UCS2,如果所有字符的剩餘LSB爲0,那麼直到拉丁-1。 –

+0

謝謝。看起來非常狂野。維護字符串的並行副本。有趣的是,他們選擇了與負載相關的編碼 –