Python caracteres latinos y Unicode

Tengo una estructura de árbol en la que las palabras clave pueden contener algunos caracteres latinos. Tengo una función que recorre todas las hojas del árbol y agrega cada palabra clave a una lista bajo ciertas condiciones.

Aquí está el código que tengo para agregar estas palabras clave a la lista:

print "Adding: " + self.keyword leaf_list.append(self.keyword) print leaf_list 

Si la palabra clave en este caso es université , entonces mi salida es:

 Adding: université ['universit\xc3\xa9'] 

Parece que la función de impresión muestra correctamente el carácter latino, pero cuando lo agrego a la lista, se decodifica.

¿Cómo puedo cambiar esto? Necesito poder imprimir la lista con los caracteres latinos estándar, no la versión descodificada de ellos.

No tiene objetos Unicode, sino cadenas de bytes con texto codificado en UTF-8. La impresión de tales cadenas de bytes en su terminal puede funcionar si su terminal está configurada para manejar texto UTF-8.

Al convertir una lista en una cadena, el contenido de la lista se muestra como representaciones ; El resultado de la función repr() . La representación de un objeto de cadena utiliza códigos de escape para cualquier byte fuera del rango ASCII imprimible; Las nuevas líneas se reemplazan por \n por ejemplo. Sus bytes UTF-8 están representados por \xhh secuencias de escape.

Si estuviera usando objetos Unicode, la representación \xhh escapes \xhh , pero solo para puntos de código Unicode en el rango Latin-1 (fuera de ASCII) (el rest se muestra con \uhhhh y escapes \Uhhhhhhhh dependiendo de su punto de código); al imprimir Python codifica automáticamente dichos valores a la encoding correcta para su terminal:

 >>> u'université' u'universit\xe9' >>> len(u'université') 10 >>> print u'université' université 

Compare esto con las cadenas de bytes:

 >>> 'université' 'universit\xc3\xa9' >>> len('université') 11 >>> 'université'.decode('utf8') u'universit\xe9' >>> print 'université' université 

Tenga en cuenta que la longitud refleja que el punto de código é está codificado en dos bytes. Por cierto, fue mi terminal el que presentó a Python los \xc3\xa9 bytes al pegar el carácter é en la sesión de Python, ya que está configurado para usar UTF-8, y Python lo detectó y descodificó los bytes cuando lo definí. a u'..' Unicode objeto literal.

Te recomiendo que leas los siguientes artículos para entender cómo Python maneja Unicode, y cuál es la diferencia entre el texto de Unicode y las cadenas de bytes codificadas:

  • El Absoluto Mínimo que todos los desarrolladores de software absolutamente, positivamente deben saber sobre Unicode y conjuntos de caracteres (¡sin excusas!) Por Joel Spolsky

  • El CÓMO de Python Unicode

  • Unicode pragmático de Ned Batchelder

Cuando imprime una lista, obtiene la repr de los elementos que contiene, que para las cadenas es diferente de su contenido:

 >>> a = ['foo', 'bär'] >>> print(a[0]) foo >>> print(repr(a[0])) 'foo' >>> print(a[1]) bär >>> print(repr(a[1])) 'b\xc3\xa4r' 

Se supone que la salida de repr es amigable para el progtwigdor, no para el usuario, de ahí las citas y los códigos hexadecimales. Para imprimir una lista de una manera fácil de usar, escriba su propio bucle. P.ej

 >>> print '[', ', '.join(a), ']' [ foo, bär ]