Python – cadena de encoding – letras suecas

Estoy teniendo algunos problemas con el comando raw_input de Python (Python2.6), por alguna razón, el raw_input no obtiene la cadena convertida que produce swedify () y esto me da un error de encoding del cual soy consciente, por eso hecho swedify () para empezar. Esto es lo que estoy tratando de hacer:

elif cmd in ('help', 'hjälp', 'info'): buffert += 'Just nu är programmet relativt begränsat,\nDe funktioner du har att använda är:\n' buffert += ' * historik :: skriver ut all din historik\n' buffert += ' * ändra  :: ändrar något i databasen, följande finns att ändra:\n' print swedify(buffert) 

Esto funciona bien, genera los caracteres suecos tal como los quiero en la consola. Pero cuando bash (en el mismo código, con los mismos valores \ x ??, imprimir esta pieza:

 core['goalDistance'] = raw_input(swedify('Hur långt i kilometer är ditt mål: ')) core['goalTime'] = raw_input(swedify('Vad är ditt mål i minuter att springa ' + core['goalDistance'] + 'km på: ')) 

Entonces entiendo esto:

 C:\Users\Anon>python löp.py Traceback (most recent call last): File "l÷p.py", line 92, in  core['goalDistance'] = raw_input(swedify('Hur l├Ñngt i kilometer ├ñr ditt m├Ñl: ')) UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 5: ordinal not in range(128) 

Ahora he buscado en Google, he encontrado algunas “soluciones”, pero ninguna de ellas funciona, algunas están tristes porque tengo que crear un script por lotes que ejecute chcp. Al principio, pero eso no es una solución limpia de la OMI.

Aquí está swedify:

 def swedify(inp): try: return inp.decode('utf-8') except: return '(!Dec:) ' + str(inp) 

¿Alguna solución sobre cómo obtener raw_input para leer mi valor de retorno de swedify ()? He intentado desde codificar importación getencoder, getdecoder y otros, pero nada para mejor.

Menciona el hecho de que recibió un error de encoding que lo motivó a escribir swedify en primer lugar, y ha encontrado soluciones en torno a chcp que es un comando de Windows.

En los sistemas * nix con terminales UTF-8, swedify no es necesario:

 >>> raw_input('Hur långt i kilometer är ditt mål: ') Hur långt i kilometer är ditt mål: 100 '100' >>> a = raw_input('Hur långt i kilometer är ditt mål: ') Hur långt i kilometer är ditt mål: 200 >>> a '200' 

FWIW, cuando uso swedify , recibo el mismo error que tú:

 >>> def swedify(inp): ... try: ... return inp.decode('utf-8') ... except: ... return '(!Dec:) ' + str(inp) ... >>> swedify('Hur långt i kilometer är ditt mål: ') u'Hur l\xe5ngt i kilometer \xe4r ditt m\xe5l: ' >>> raw_input(swedify('Hur långt i kilometer är ditt mål: ')) Traceback (most recent call last): File "", line 1, in  UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 5: ordinal not in range(128) 

Su función swedify devuelve un objeto Unicode. El raw_input no está contento con los objetos Unicode.

 >>> raw_input("å") åeee 'eee' >>> raw_input(u"å") Traceback (most recent call last): File "", line 1, in  UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 0: ordinal not in range(128) 

Es posible que desee probar esto en Python 3. Ver este error de Python .

También de interés: ¿Cómo leer la entrada Unicode y comparar las cadenas Unicode en Python? .

ACTUALIZACIÓN De acuerdo con esta publicación de blog, hay una manera de configurar la encoding predeterminada del sistema. Esto podría valer la pena intentarlo.

Para mí funcionó bien con:

 #-*- coding: utf-8 -*- import sys import codecs koden=sys.stdin.encoding a=raw_input( u'Frågan är öppen? '.encode(koden)) print a 

Por

En Windows, el soporte nativo de Unicode de la consola no funciona. Incluso la página de códigos UTF-8 aparente no es una solución adecuada.

Para leer y escribir con la consola de Windows, necesita usar https://github.com/Drekin/win-unicode-console , que funciona directamente con la API de la consola subyacente, para que los caracteres de varios bytes se lean y escriban correctamente.

El símbolo del sistema de Windows usa la página de códigos 850 cuando usa la configuración regional sueca ( https://en.wikipedia.org/wiki/Code_page_850 ). Probablemente se usa debido a la compatibilidad con versiones anteriores de los antiguos progtwigs MS-Dos.

Puede configurar el indicador de comando de Windows para usar UTF-8 como encoding ingresando: chcp 65001 ( caracteres Unicode en la línea de comando de Windows – ¿cómo? )

Prueba este comentario mágico en la parte superior de tu script:

 # -*- coding: utf-8 -*- 

Aquí hay alguna información al respecto: http://www.python.org/dev/peps/pep-0263/

Solución a muchos problemas:

Edición: C: \ Python ?? \ Lib \ Site.py Reemplace “del sys.setdefaultencoding” con “pass”

Entonces,
Ponga esto en la parte superior de su código:

 sys.setdefaultencoding('latin-1') 

El santo grial de arreglar los caracteres suecos / no compatibles con UTF8.