2011-09-21 10 views
7

CPython memorizza le stringhe unicode come utf-16 o utf-32 internamente in base alle opzioni di compilazione. Nelle versioni utf-16 di slicing delle stringhe di Python, iterazione e len sembrano funzionare su unità di codice, non su punti di codice, in modo che i caratteri multibyte si comportino in modo strano.Cosa significa sys.maxunicode?

esempio su CPython 2.6 con sys.maxunicode = 65535:

>>> char = u'\U0001D49E' 
>>> len(char) 
2 
>>> char[0:1] 
u'\uu835' 
>>> char[1:2] 
u'\udc9e' 

Secondo la documentazione di Python, sys.maxunicode è "Un intero che il più grande punto di codice supportato per un carattere Unicode."

Ciò significa che le operazioni unicode non sono garantite per funzionare su punti di codice oltre sys.maxunicode? Se voglio lavorare con personaggi al di fuori del BMP, devo usare una compilazione utf-32 o scrivere le mie operazioni portatili unicode?

mi sono imbattuto in questo problema in How to iterate over Unicode characters in Python 3?

+0

Interessante. Su CPython 3.2.2 (Win x64), 'sys.maxunicode' è' 65535' ... –

risposta

3

personaggi al di là sys.maxunicode=65535 vengono memorizzati internamente con UTF-16 surrogati. Sì, devi occupartene da solo o utilizzare una build estesa. Anche con una build estesa potresti dover gestire anche singoli caratteri rappresentati da una combinazione di punti di codice. Ad esempio:

>>> print('a\u0301') 
á 
>>> print('\xe1') 
á 

Il primo utilizza un carattere accento combinato e il secondo no. Entrambi stampano lo stesso. È possibile utilizzare unicodedata.normalize per convertire i moduli.