Pregunta

Tengo una cadena en Unicode y necesito volver a los primeros N caracteres. Estoy haciendo esto:

result = unistring[:5]

pero por supuesto la longitud de las cadenas Unicode! = Longitud de caracteres. ¿Algunas ideas? La única solución es utilizar re?

Edit: Más información

unistring = "Μεταλλικα" #Metallica written in Greek letters
result = unistring[:1]

VUELTA a>?

Creo que las cadenas Unicode son dos bytes (carbón de leña), es por eso que esto sucede. Si hago:

result = unistring[:2]

consigo

M

que es correcta, Por lo tanto, en caso de que siempre rebanada * 2 o debería convertir en algo?

¿Fue útil?

Solución

Lamentablemente, por razones históricas anteriores a Python 3.0, hay dos tipos de cadenas. byte de cuerdas (str) y Unicode cadenas (unicode ) .

Antes de la unificación en Python 3.0, hay dos formas de declarar una cadena literal:. unistring = "Μεταλλικα" que es una cadena de bytes y unistring = u"Μεταλλικα" que es una cadena Unicode

La razón por la que se ve cuando se hace ? result = unistring[:1] se debe a que algunos de los caracteres del texto Unicode no se puede representar correctamente en la cadena no Unicode. Es probable que haya visto este tipo de problema si alguna vez usó un cliente de correo electrónico muy viejo y recibido correos electrónicos de amigos en países como Grecia, por ejemplo.

Así que en Python 2.x, si usted necesita para manejar Unicode que tiene que hacer de forma explícita. Echar un vistazo a esta introducción a tratar con Unicode en Python: Unicode COMO

Otros consejos

Cuando dice:

unistring = "Μεταλλικα" #Metallica written in Greek letters

No tenemos una cadena Unicode. Usted tiene una cadena de bytes en UTF-8 (presumiblemente). Esa no es la misma cosa. Una cadena Unicode es un tipo de datos separada en Python. Se obtiene mediante la decodificación de cadenas de bytes Unicode utilizando la codificación correcta:

unistring = "Μεταλλικα".decode('utf-8')

o utilizando el literal Unicode en un archivo fuente con la derecha declaración de codificación

# coding: UTF-8
unistring = u"Μεταλλικα"

La cadena Unicode hará lo que quiere cuando lo hace unistring[:5].

No hay enfoque directo con correcta con cualquier tipo de "cadena Unicode".

A pesar de Python "Unicode" cadena UTF-16 ha caracteres de longitud variable es así, usted puede no sólo cortar con ustring [5]. Debido a que algunos puntos de código Unicode pueden usar más de un "carácter" es decir, pares de sustituto.

Así que si usted quiere cortar 5 puntos código (tenga en cuenta estos no son caracteres ) por lo que puede analizar el texto, véase http://en.wikipedia.org/wiki/UTF-8 y http://en.wikipedia.org/wiki/UTF-16 definiciones. Así que hay que utilizar algunas máscaras de bits de averiguar límites.

También usted todavía no consigue caracteres. Debido a que por ejemplo. Palabra "שָלוֹם" - paz en "Shalom" en hebreo se compone de 4 caracteres y 6 puntos clave letras "shin", vocal "a" letra "lamed", la letra "vav" y vocal "o" y la letra final "mem".

Entonces carácter no punto de código .

Lo mismo para la mayoría de los idiomas occidentales, donde una carta con diacríticos se puede representar como dos puntos de código. Por ejemplo, para buscar "normalización Unicode".

Así que ... Si realmente necesita 5 primeros caracteres que tiene que utilizar herramientas como biblioteca de la UCI. Por ejemplo, hay biblioteca UCI para Python que proporciona caracteres iterador límite.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top