2012-08-03 15 views
6

Tengo el siguiente script en Python:¿Por qué la configuración no localiza este error UnicodeError?

# -*- coding: utf-8 -*- 
import sys, locale 
locale.setlocale(locale.LC_ALL, 'en_US.utf8') 
print '肥皂' # This works 
print u'肥皂' 

Cuando se ejecuta el guión me sale:

肥皂 
Traceback (most recent call last): 
    File "../pycli/samples/x.py", line 5, in <module> 
    print u'肥皂' 
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256) 

Sin embargo, cuando me puse explícitamente la variable de entorno LC_ALL en la cáscara entonces funciona

export LC_ALL=en_US.utf8 

Entonces, me pregunto por qué el setlocale() no tiene el mismo efecto.

+0

¿Has probado con 'en_US.utf-8'? –

+0

sí, lo intenté pero con los mismos resultados – trinth

+0

¿Intentó codificar ('utf-8') su salida? –

Respuesta

2

El valor solo se usa para especificar el conjunto de caracteres predeterminado para la salida en el inicio del intérprete. En otras palabras, ya es demasiado tarde una vez que el script esté funcionando.

+0

En ese caso, ¿por qué existe el método? Parece que mi única opción es configurar manualmente las variables de entorno. – trinth

1

Unicode es como una idea conceptual de texto que solo está presente en el programa.

Tiene la ventaja de que puede admitir cualquier carácter, pero tiene la desventaja de que no se puede imprimir tal como está y, por lo tanto, debe codificarse para alguna codificación que pueda mostrarse.

Por lo tanto, si desea alguna entrada, se codificará y deberá decodificarla, y si desea generar unicode, debe codificarla.

Si no lo hace, python lo intentará y lo hará por usted (usando ASCII, o lo que pueda encontrar en su entorno, como en su caso), pero no debe confiar en esto, porque python podría equivocarse (como en tu caso).

Curiosamente, puede observar que en su caso su terminal admite utf8, pero que python no se dio cuenta de que podría estar usando utf8.

Es por eso que usted debe salida siempre codificar y decodificar de entrada (preferiblemente usando UTF-8 cuando sea posible!)

Esto se puede conseguir utilizando el método de codificación Unicode y el método de cadena de decodificación, dándoles la codificación como argumento.

Cuestiones relacionadas