2012-02-01 21 views
5

Si tengo una lista de cadenas UnicodeLista de cadenas Unicode

lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ] 

es necesario escribir un prefijo u antes de cada cadena? ¿Puedo hacer una construcción que diga que cada elemento de la primera será cadena unicode y luego escribirlo sin el prefijo u?

+0

Esto depende de que el uso de Python 2 o Python 3. –

+0

estoy usando '' Python 2.7.2 +, pero si usted sabe la respuesta para ambos podría ser útil para el futuro – xralf

+0

En Python 3.x todos los strings son unicode por defecto, y cualquier canal que trate con E/S de texto (archivos, base de datos, impresión) requiere una codificación explícita o usa la codificación de sistema por defecto. – jsbueno

Respuesta

14

En Python 2.7 (también Python 2.6) se puede hacer literales Unicode del defecto para un módulo:

from __future__ import unicode_literals 

Debe incluir la importación en la parte superior del archivo, y luego se aplica a todos literales de cadena en el archivo. Utilizar un prefijo b para obligar a cadenas de bytes:

>>> from __future__ import unicode_literals 
>>> "sss" 
u'sss' 
>>> b"x" 
'x' 
1

Si su intención es la de convertir un conjunto de cadenas estándar a Unicode, se puede asignar esa función en su lista:

lst = ["aaa", "bbb", "ccc"] 
map(unicode, lst) 

que da

[u"aaa", u"bbb", u"ccc"] 

Sin embargo, si lst contiene un no ASCII cadena de caracteres, tendrá que prefijar esa cadena en particular con el u. Si no lo hace, obtendrá este error en la conversión:

lst = ["\xe4"] 
map(unicode,lst) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 

Como se señaló en los comentarios, esta respuesta es diferente para Python 2.x o 3.x. En Python 3, everything changes:

Todo lo que creía conocer sobre datos binarios y Unicode ha cambiado. Python 3.0 usa los conceptos de texto y datos (binarios) en lugar de cadenas Unicode y cadenas de 8 bits. Todo el texto es Unicode; sin embargo, el código Unicode se representa como datos binarios. El tipo utilizado para contener texto es str, el tipo utilizado para contener datos es bytes. La mayor diferencia con la situación 2.x es que cualquier intento de mezclar texto y datos en Python 3.0 genera TypeError, mientras que si mezclara cadenas Unicode y de 8 bits en Python 2.x, funcionaría si el de 8 bits cadena resultó contener solo bytes de 7 bits (ASCII), pero obtendría UnicodeDecodeError si contenía valores que no fueran ASCII. Este comportamiento específico del valor ha causado numerosas caras tristes a lo largo de los años.

+0

Me gustaría usar solo una declaración mejor que me ahorre tipeo. algo así como 'lst = u [" aaa "," bbb "," ccc "]' que diría que cada cadena en 'lst' es unicode. – xralf

+0

-1 por desconocimiento de las codificaciones Unicode, y pensando que "ASCII está bien" - lea http://www.joelonsoftware.com/articles/Unicode.html – jsbueno

+0

@jsbueno - No dije en ninguna parte sobre el Python 2 predeterminado. La codificación x (ASCII) está "OK". Simplemente establecí un método rápido y sucio para convertir la lista del OP de lo que parecían ser solo codificaciones ASCII en la representación unicode con la codificación ASCII explícita. ¿Es lo que él quería? No estoy del todo seguro ya que él no especificó la codificación que él quería, así que lo adiviné. Para agregar valor a este sitio, si cree que se necesita una explicación detallada sobre las diferentes codificaciones, por favor proporciónelo en otra respuesta. – Hooked

Cuestiones relacionadas