2010-10-25 16 views
22

¿En qué codificación están los elementos de sys.argv, en Python? ¿Están codificados con la codificación sys.getdefaultencoding()?Python: ¿Qué codificación se usa para procesar sys.argv?

sys.getdefaultencoding(): Devuelve el nombre de la codificación de serie predeterminada actual utilizada por la implementación Unicode.

PS: Como se ha señalado en algunas de las respuestas, sys.stdin.encoding sería ciertamente una mejor conjetura . Sin embargo, me gustaría ver una respuesta definitiva a esta pregunta, con sugerencias sobre fuentes sólidas.

PPS: Como señaló Wim, Python 3 resuelve este problema poniendo str objetos en sys.argv (si entiendo correctamente). La pregunta permanece abierta para Python 2.x, sin embargo. En Unix, la variable de entorno LC_CTYPE parece ser lo correcto para comprobar, ¿no? ¿Qué se debe hacer con Windows (para que los elementos sys.argv se interpreten correctamente independientemente de la consola)?

Respuesta

3

"¿Qué se debe hacer con Windows (para que los elementos sys.argv se interpreten correctamente sea cual sea la consola)?"

Para Python 2.x, vea this comment on issue2128.

(Tenga en cuenta que hay codificación es correcta para el sys.argv original, debido a que algunos caracteres pueden haber sido mutilado de una manera que no hay suficiente información para deshacer; por ejemplo, si la página de códigos ANSI no puede representar griega alfa entonces será destrozado a 'a'.)

+0

Marcado como aceptado: este nuevo comentario sobre el problema 2128 es información nueva. ¡Gracias! – EOL

4

En los sistemas Unix, debe estar en la configuración regional del usuario, que (extrañamente) no está relacionada con sys.getdefaultencoding. Ver http://docs.python.org/library/locale.html.

En Windows, estará en la página de códigos ANSI del sistema.

(Por cierto, los maestros de primaria que te dijo que no terminar una oración con una preposición se mintiendo.)

+0

Preposiciones colgantes es algo que no voy a poner. La supuesta estrechez contra la preposición oscilante aparentemente evolucionó a partir de una observación de estilo. A saber, la primera y la última palabra de una oración son las que tienen el impacto más natural. Por lo tanto, se consideró estilísticamente débil para una mera preposición para colocarse en una ubicación tan estratégicamente importante. –

+0

@Jim: El estilo está muy bien, pero algunas personas parecen tener esta tonta noción de que es no gramatical, lo que lleva a tal bobería como el título de esta pregunta. –

+0

El título de esta pregunta parece lo suficientemente claro, aunque podría haber sugerido el uso de * que * en lugar de "qué". Una redacción más precisa podría ser: "¿Qué codificación se usa para procesar sys.argv?" Toda la cuestión de la codificación de texto se ha complicado bastante con todos estos intentos de acomodar ambos conjuntos de caracteres internacionales conservando al mismo tiempo parte del manejo simple de cadenas ASCII. La terminología que rodea todo el asunto se ha convertido de manera similar intrincada. –

5

No sé si esto ayuda o no, pero esto es lo que me pasa en modo DOS:

C:\Python27>python Lib\codingtest.py нер 
['Lib\\codingtest.py', '\xed\xe5\xf0'] 

C:\Python27>python Lib\codingtest.py hello 
['Lib\\codingtest.py', 'hello'] 

en IDLE:

>>> print "hello" 
hello 
>>> "hello" 
'hello' 
>>> "привет" 
'\xef\xf0\xe8\xe2\xe5\xf2' 
>>> print "привет" 
привет 
>>> sys.getdefaultencoding() 
'ascii' 
>>> 

¿Qué podemos deducir de esto? Aún no lo sé ... comentaré un poco.

Un poco más tarde: sys.argv está codificado con sys.stdin.encoding y no sys.getdefaultencoding()

+0

\ xef es la representación cirílica UNICODE CP1251 de PEQUEÑA LETRA PE ('п'), por lo que estoy empezando a creer que 'sys.argv' está codificado con' sys.stin.encoding' y no 'sys.getdefaultencoding() ' – soulseekah

4

Algunas observaciones:

(1) Desde luego no es sys.getdefaultencoding.

(2) sys.stdin.encoding parece ser una apuesta mucho mejor.

(3) En Windows, el valor real de sys.stdin.encoding variará, dependiendo de qué software proporcione el stdio. IDLE usará la página de códigos del sistema "ANSI", p. cp1252 en la mayor parte de Europa Occidental y América y sus antiguas colonias. Sin embargo, en la ventana Símbolo del sistema, que emula MS-DOS más o menos, se utilizará la página de códigos del DOS anterior correspondiente (por ejemplo, cp850) de forma predeterminada. Esto se puede cambiar utilizando el comando CHCP (cambiar la página de códigos).

(4) La documentación para el módulo de subproceso no proporciona ninguna sugerencia sobre qué codificación usar para args y stdout.

(5) Se confía en que assert sys.stdin.encoding == sys.stdout.encoding nunca falla.

+0

Las observaciones parecen ser correctas, también he observado lo mismo. ¿Tiene alguna idea de qué devuelve exactamente sys.getdefaultencoding? –

+0

"Devuelve el nombre de la codificación de cadena predeterminada actual utilizada por la implementación de Unicode". Creo que significa que Python usa el defecto de codificación() en su consola. Puede anular la codificación defaul() precediendo 'u'' por cierto. Gran respuesta +1 – soulseekah

+4

Estoy de acuerdo sobre (2) - Pensé en ello más tarde. (5) no es verdad: en Unix, 'python test.py> test.txt' puede tener, por ejemplo, UTF-8 para la codificación stdin y None para la codificación stdout. – EOL

7

Supongo que estás preguntando esto porque te encontraste con issue 2128. Tenga en cuenta que esto se ha solucionado en Python 3.0.

+0

Gracias, verifico el enlace. De hecho, estoy haciendo la pregunta de forma preventiva, antes de escribir un programa que toma los mensajes del usuario desde la línea de comandos. – EOL

+0

¿Qué hay de Python 2.x? y Windows? – EOL

0

sys.getfilesystemencoding() funciona para mí, al menos en Windows. En Windows, en realidad es 'mbcs' y 'utf-8' en * nix.