2011-09-21 8 views
7

CPython almacena cadenas de caracteres unicode como utf-16 o utf-32 internamente dependiendo de las opciones de compilación. En las construcciones utf-16 de Python string slicing, iteration y len parecen funcionar en unidades de código, no en puntos de código, de modo que los caracteres multibyte se comportan de manera extraña.¿Qué significa sys.maxunicode?

por ejemplo, en CPython 2.6 con sys.maxunicode = 65535:

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

De acuerdo con la documentación de Python, es sys.maxunicode "Entero que proporciona el mayor punto de código con el apoyo de un carácter Unicode."

¿Esto significa que las operaciones unicode no están garantizadas para trabajar en puntos de código más allá de sys.maxunicode? Si quiero trabajar con personajes fuera del BMP, ¿tengo que usar una compilación utf-32 o escribir mis propias operaciones portátiles unicode?

me encontré con este problema en How to iterate over Unicode characters in Python 3?

+0

Interesante. En CPython 3.2.2 (Win x64), 'sys.maxunicode' es' 65535' ... –

Respuesta

3

caracteres más allá sys.maxunicode=65535 se almacenan internamente con UTF-16 sustitutos. Sí, tiene que tratar con esto usted mismo o usar una construcción amplia. Incluso con una construcción amplia, también puede tener que lidiar con caracteres individuales representados por una combinación de puntos de código. Por ejemplo:

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

La primera utiliza un carácter de acento combinado y la segunda no. Ambos imprimen lo mismo. Puede usar unicodedata.normalize para convertir los formularios.