2013-10-15 6 views
5

Unten ist ein einfacher Test. repr scheint gut zu funktionieren. noch len und x for x in scheint nicht die Unicode-Text korrekt in Python 2.6 und 2.7 zu teilen:Unterstützt Python Unicode über die grundlegende mehrsprachige Ebene hinaus?

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'] 

Eine gute Nachricht ist Python 3.3 das Richtige tut ™.

Gibt es Hoffnung für Python 2.x-Serie?

Antwort

10

Ja, vorausgesetzt, Sie haben Python mit Wide-Unicode-Unterstützung kompiliert.

Standardmäßig wird Python nur mit eingeschränkter Unicode-Unterstützung erstellt. Aktivieren breite Unterstützung mit:

./configure --enable-unicode=ucs4 

Sie können überprüfen, welche Konfiguration durch Testen sys.maxunicode verwendet wurde:

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

Eine große build verwenden UCS4 Zeichen für alle Unicode-Werte, die Speichernutzung für diese Verdoppelung. Python 3.3 wechselte zu variablen Breitenwerten; Nur genügend Bytes werden verwendet, um alle Zeichen im aktuellen Wert darzustellen.

Schnell Demo zeigt, dass eine große Build Griffe Unicode Ihre Probe Zeichenfolge richtig: Verwendung

$ 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

Welche Codierung tut 3.3? –

+1

@DavidHeffernan: Siehe [PEP 393] (http://docs.python.org/3/whatsnew/3.3.html#pep-393); bis zu UCS4, Herunterfahren auf UCS2, wenn die 2 LSB-Bytes 0 für alle Zeichen sind, bis hinunter zu Latin-1, wenn das verbleibende LSB für alle Zeichen 0 ist. –

+0

Danke. Sieht ziemlich wild aus. Parallele Kopien der Zeichenkette pflegen. Und interessant, dass sie die nutzlastabhängige Kodierung gewählt haben. –

Verwandte Themen