Problema de conversión de Python UTF-8

En mi base de datos, he almacenado algunos caracteres UTF-8. Por ejemplo, ‘α’ en el campo “nombre”

A través de Django ORM, cuando leo esto, obtengo algo como

>>> p.name u'\xce\xb1' >>> print p.name α 

Esperaba ‘α’.

Después de algunas excavaciones, creo que si lo hice.

 >>> a = 'α' >>> a '\xce\xb1' 

Entonces, cuando Python intenta mostrar ‘\ xce \ xb1’, obtengo alfa, pero cuando intenta mostrar u ‘\ xce \ xb1’, ¿es doble encoding?

¿Por qué obtuve u ‘\ xce \ xb1’ en primer lugar? ¿Hay alguna manera de que pueda volver ‘\ xce \ xb1’?

Gracias. Mi conocimiento de UTF-8 y manejo de Unicode realmente necesita ayuda …

Intente colocar la firma u Unicode antes de su cadena, por ejemplo, u'YOUR_ALFA_CHAR' y revise la encoding de su base de datos, ya que Django siempre admite UTF-8.

Lo que parece tener son los bytes individuales de una cadena codificada en UTF-8 interpretada como puntos de código Unicode. Puedes “decodificar” tu cadena de esta forma extraña con:

 p.name = ''.join(chr(ord(x)) for x in p.name) 

o quizás

 p.name = ''.join(chr(ord(x)) for x in p.name).decode('utf8') 

Una forma de que sus cadenas se “codifiquen” en esta forma es

 ''.join(unichr(ord(x)) for x in '\xce\xb1') 

aunque tengo la sensación de que sus cadenas realmente se pusieron en este estado debido a que diferentes componentes de su sistema no están de acuerdo con la encoding en uso.

Probablemente tendrá que corregir la fuente de su “encoding” incorrecta en lugar de corregir los datos que se encuentran actualmente en su base de datos. Y el código anterior podría estar bien para convertir sus datos erróneos una vez, pero le aconsejaría que no inserte este código en su aplicación Django.

El problema es que p.name no se almacenó correctamente o no se leyó desde la base de datos.

Unicode pequeño alfa es U + 03B1 y p.name debería haberse impreso como u ‘\ x03b1’ o si estaba usando un terminal con capacidad para Unicode, el símbolo alfa real en sí podría haberse impreso entre comillas. Note la diferencia entre u ‘\ xce \ xb1’ y u ‘\ xceb1′. La primera es una cadena de dos caracteres y la última en una cadena de un solo carácter. No tengo idea de cómo se tradujo el byte ’03’ del UTF-8 a ‘CE’.

Puede convertir cualquier secuencia de bytes en una representación interna de Unicode a través de la función de deencoding:

 print '\xce\xb1'.decode('utf-8') 

Esto le permite importar una secuencia de bytes de cualquier fuente y luego convertirla en una cadena Python Unicode.

Referencia: http://docs.python.org/library/stdtypes.html#string-methods

Intente convertir la encoding con p.name.encode('latin-1') . Aquí hay una demostración:

 >>> print u'\xce\xb1' α >>> print u'\xce\xb1'.encode('latin-1') α >>> print '\xce\xb1' α >>> '\xce\xb1' == u'\xce\xb1'.encode('latin1') True 

Para obtener más información, consulte str.encode y codificaciones estándar .