ipython aşağıdaki alışverişini düşünün içerdiğinde:Python: Doğru dize uzunluğunu almak o vekil çiftleri
In [1]: s = u'華袞與緼同歸'
In [2]: len(s)
Out[2]: 8
doğru çıktı 7
olmalıydı, ama bu yedi Çince karakter beşinci yüksek Unicode koduna sahip olduğundan -point, UTF-8'de sadece bir basit kod noktasından ziyade bir "temsilci çift" ile temsil edilir ve sonuç olarak Python bunun bir değil iki karakter olduğunu düşünür. len()
geçirilen zaman
Tek bir kod noktasıyla (\U00026177
) olarak doğru yedek çifti döndüren unicodedata
, kullansanız bile, yanlış uzunluk hala döndürülür:
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
için Python yeniden derlenmesine gibi köklü adımlar atılmadan UTF-32, bunun gibi durumlarda doğru uzunluğu elde etmek için basit bir yol var mı?
IPython üzerinde çalışıyorum 0.13, Python 2.7.2, Mac OS 10.8.2.
Tartışmalar [burada] (http://stackoverflow.com/questions/9934752/platform-specific-unicode-semantics-in-python-2-7) ve [burada] (http://stackoverflow.com/ sorular/6922480/nasıl yapılır-güvenilir-unicode-karakter-say-in-python) ilgili görünüyor. – DSM
@DSM: Bunları kazandığınız için teşekkür ederiz. İlk bağlantınız, Python'u UTF-32 ("geniş yapılı") için derlediğimi gösteriyor. İkincisi, gerçekte doğru karakterleri saymak için böğürtlenin cevabı ayrıntılı bir kod parçası gösterir. Benim varsayılan geçici çözümüm, ikincisine benzer, ama daha çok doğrudan ve yerleşik bir şey olduğunu umuyorum. – brannerchinese
Sonuçlarınızı burada yeniden oluşturamıyorum (Ubuntu box, python 2.7.2). Unicode için u '\ u83ef \ u889e \ u8207 \ u7dfc \ U00026177 \ u540c \ u6b78' Ben hem len (ler) hem de len (unicode.normalize ('NFC', s)) ile yedi bir uzunluk elde ediyorum – Vicent