Python - Código de página y caracteres especiales en línea de comandos

 
Vista:

Código de página y caracteres especiales en línea de comandos

Publicado por wildfandango (6 intervenciones) el 06/07/2017 10:19:20
Hola a Todos.

Después de muchas pruebas y mucho leer me estoy volviendo loco con lo típico... un problema con el que no contaba, que parece superfácil y que por mucho que Googleo no le encuentro solución...

El caso es que tengo un programe de línea de comandos para Windows hecho en Python (que compilo con py2exe)

El programa lo he simplificado al máximo (con Python eso es fácil... :P) es este:

1
2
3
4
5
6
7
8
# -*- coding: Windows-1252 -*-
import sys
 
if __name__ == '__main__':
	if len(sys.argv) > 1:
		print sys.argv[1] + "\n"
	else:
		print "€çÇñÑâÂãÃàÀáÁêÊèÈéÉîÎìÌíÍôÔòÒóÓõÕûÛúÚùÙ\n"

Si recibe un parámetro lo imprime por pantalla y si no recibe nada imprime esa cadena de caracteres...

A ese programa lo invoco desde un fichero .cmd muy sencillo:

1
2
3
"test.exe" "€çÇñÑâÂãÃàÀáÁêÊèÈéÉîÎìÌíÍôÔòÒóÓõÕûÛúÚùÙ"
"test.exe"
pause

Pues aquí es donde la cosa se lía, yo lo que esperaría que sucediese es obtener una respuesta doble del tipo:

1
2
3
C:\>€çÇñÑâÂãÃàÀáÁêÊèÈéÉîÎìÌíÍôÔòÒóÓõÕûÛúÚùÙ
C:\>€çÇñÑâÂãÃàÀáÁêÊèÈéÉîÎìÌíÍôÔòÒóÓõÕûÛúÚùÙ

(la primera vez me devolvería el parámetro y la segunda imprimiría la cadena directamente desde Python...)

Pues lo que me devuelve es esto (sé/supongo que tiene que ver con el código de página pero no sé por donde tirar):

1
2
3
C:\>Ã■├▒ðÈ-Ê+Ë+--Ì++»+²ª¦-Â╚=╩¥╦ºi╣ªÀ+¿+
C:\>ÇþñÐÔ┬Ò├Ó└ß┴Û╩Þ╚Ú╔¯╬ý╠Ý═¶È‗ʾ˧ı¹█·┌¨┘

Les agradecería ayuda sobre este tema y la forma correcta de tratar los caracteres especiales en estas circunstancias... Gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 1.421
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Código de página y caracteres especiales en línea de comandos

Publicado por xve (1636 intervenciones) el 06/07/2017 17:19:34
Has probado a poner la codificación:
1
# -*- coding: utf-8 -*-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Código de página y caracteres especiales en línea de comandos

Publicado por wildfandango (6 intervenciones) el 08/07/2017 18:50:40
Gracias por la contestación, he probado lo que me sugieres pero no cambió nada.

Si meto como dices # -*- coding: utf-8 -*-

y lo invoco por ejemplo así:
python test.py "Ññ"

me devuelve!:
б

y repito el programa es tan sencillo como:
1
2
3
# -*- coding: utf-8 -*-
import sys
print sys.argv[1]

Entiendo que la solución debe ser superevidente pero se me escapa totalmente...

Solo necesito hacer un programa de linea de comandos que reciba eñes tíldes y demás como parámetro y que las respete y reciba tal cual...!!!!

socorro!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.139
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Código de página y caracteres especiales en línea de comandos

Publicado por kip (257 intervenciones) el 09/07/2017 04:28:47
Hola, si estas sobre Windows una solución rápida y fácil seria:

1
print sys.argv[1].decode('cp1252')

cp1252 es la codificación mas usada en Windows.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Código de página y caracteres especiales en línea de comandos

Publicado por wildfandago (6 intervenciones) el 09/07/2017 12:47:31
He repetido las pruebas siguiendo ese consejo. De nuevo dos pruebas supersencillas. (en realidad he hecho muchas mas pero estas son las mas representativas) he utilizado 1252 por tu consejo y 850 porque es el valor devuelto por el comando chcp de linea de comandos de Windows.

ejecuto así:
c:\>python test.py "Ññ"

Este programa:
1
2
3
# -*- coding: cp1252 -*-
import sys
print sys.argv[1].decode("cp1252")

Y este programa:
1
2
3
# -*- coding: cp850 -*-
import sys
print sys.argv[1].decode("cp850")

En ambos casos el valor obtenido ha sido.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar