¿Cómo evitar que str codifique caracteres Unicode como códigos hexadecimales?

Cuando print una cadena Unicode en Python directamente, veo una cadena con los mismos caracteres que tengo en mi cadena. Cuando lo incrusté en algún contenedor (puesto en una lista, en un mapa, etc.), la representación de str convierte los caracteres Unicode en representación de \ uXXXX. Curiosamente, puedo llamar a una print en este contenedor con una cadena, pero no puedo print str de una cadena en sí (da un UnicodeEncodeError).

¿Puedo configurar str para codificar cadenas anidadas a cadenas UTF8? Mirar los símbolos de este hexágono hace que la depuración sea muy dolorosa.

Ejemplo:

 >>> v = u"abc123абв" >>> d = [v] >>> print v abc123абв >>> print d [u'abc123\u0430\u0431\u0432'] >>> print str(v) Traceback (most recent call last): File "", line 1, in  UnicodeEncodeError: 'ascii' codec cant encode characters in position 6-8: ordinal not in range(128) >>> print str(d) [u'abc123\u0430\u0431\u0432'] 

Estoy usando Python 2.7.6 en ubuntu y la encoding de la consola es UTF8. Python parece usar también UTF8:

 >>> print(sys.stdout.encoding) UTF-8 >>> print(locale.getpreferredencoding()) UTF-8 >>> print(sys.getfilesystemencoding()) UTF-8 

print [v] llama a repr(v) que devuelve los caracteres imprimibles con ascii tal como están y todo lo demás se escapa usando \x , \u , \U , …

Recuerde que un objeto como dict(a=1) es diferente de su representación de texto ( repr(dict(a=1)) ). La cadena Unicode también es un objeto ( type(v) == unicode ) como cualquier otro y, por lo tanto, repr(v) is not v (por cierto, repr(repr(v)) is not repr(v) también – piénselo) .

Para mostrar texto legible por humanos para la depuración en la consola de Python, puede proporcionar sys.displayhook personalizado, por ejemplo, puede codificar cualquier objeto unicode (incrustado) usando sys.stdout.encoding . En Python 3, repr(unicode_string) devuelve caracteres Unicode que se pueden imprimir en el entorno actual tal como está (se escapan los caracteres que podrían causar que UnicodeEncodeError se escape).

str(v) elevar UnicodeEncodeError no está relacionado. str(v) llama a v.encode(sys.getdefaultencoding()) y, por lo tanto, falla para cualquier cadena Unicode con caracteres que no sean ASCII. No llame a str() en cadenas Unicode (casi siempre es un error), imprima Unicode directamente en su lugar.

No cambies str , cambia tu way of thinking .

Si necesita imprimir el elemento netsted en lugar de obtenerlo del contenedor e imprimirlo, no imprima todo el contenedor.

 v = u"abc123абв" d = [v, v, v] print d[0] # abc123абв print ", ".join(d) # abc123абв, abc123абв, abc123абв 

btw: Python imprime el código hexadecimal (y otros elementos) por razones de prueba / depuración.

Cuando veas

 [u'abc123\u0430\u0431\u0432'] 

usted sabe: es lista ( [ y ] ) con texto Unicode ( u y ' ) y hay caracteres que no son ASCII en ese texto.