Python: ¿Qué codificación se usa para procesar sys.argv?
encoding (6)
Algunas observaciones:
(1) Ciertamente 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", por ej., cp1252
en la mayor parte de Europa occidental y América y sus antiguas colonias. Sin embargo, en la ventana del símbolo del sistema, que emula más o menos MS-DOS, 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.
¿En qué codificación están los elementos de sys.argv
, en Python? ¿Están codificados con la codificación sys.getdefaultencoding()
?
sys.getdefaultencoding (): devuelve el nombre de la codificación de serie predeterminada actual utilizada por la implementación de Unicode.
PD : Como se señaló en algunas de las respuestas, sys.stdin.encoding
sería una mejor suposición . 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 al poner objetos str
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)?
En sistemas Unix, debe estar en la configuración regional del usuario, que (extrañamente) no está vinculada a 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, esos maestros de escuela primaria que te dijeron que no terminaras una oración con una preposición te mentían).
No sé si esto ayuda o no, pero esto es lo que obtengo en el 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 con sys.getdefaultencoding()
Supongo que estás preguntando esto porque te encontraste con el problema 2128 . Tenga en cuenta que esto se ha solucionado en Python 3.0.
"¿Qué se debería hacer con Windows (para que los elementos sys.argv se interpreten correctamente independientemente de la consola)?"
Para Python 2.x, vea este comentario en el número2128 .
(Tenga en cuenta que ninguna codificación es correcta para el sys.argv original, porque algunos caracteres pueden haber sido mutilados de forma tal que no hay suficiente información para deshacer; por ejemplo, si la página de códigos ANSI no puede representar alfa griega, entonces se destruirá) un''.)
sys.getfilesystemencoding () funciona para mí, al menos en Windows. En Windows, en realidad es ''mbcs'' y ''utf-8'' en * nix.