Köra Python-program med UTF-8 teckenkodning som default

  • Författare
  • Meddelande
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10972
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Köra Python-program med UTF-8 teckenkodning som default

Inlägg03 okt 2014, 11:49

Om felet dyker upp vid dbwebb inspect:

Execute the program marvin.py [Yn]? y

Traceback (most recent call last):
File "marvin.py", line 324, in <module>
main()
File "marvin.py", line 274, in main
menu()
File "marvin.py", line 251, in menu
""")
File "/usr/lib/python3.2/encodings/iso8859_15.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-29: character maps to <undefined>


Gå in på ssh.student och lägg till följande rad i din .cshrc.

Kod: Markera allt
setenv LC_CTYPE sv_SE.UTF-8


Någon har hittat en fin bild med UTF-8 tecken som behöver hanteras.

░░░░░░░░░░░░░░░░░░░░░░░░████▓
░░░░░░▓█▓░░░░░░░░░░░░░░█▓▒▒▓██░░██████▓
░░░░▓███████▓░░░░▓██████▒▒▒▒▒█████▓▒▒▒██
░░░░██░░░░░▓███████████▒▒▒▒▒▒▒█▓▒▒▒▒▒▒▒█
░░░██░░░░░░░░░░░░░░░██▒▒▒▓████████▒▒▒▒▓█▓
░░░██░░░░░░░░░░░░░░░██▒▒▒██▒██▒▒▓████████
░░░██░░░░░░░░░░░░░░░██▒▒▒▒▓██▒▒▒▒▒██▒▒▒▒██
░░░███▓░░░░░░░░░░░░░░████████▒▒▒▒▒██▒▒▒██
░░░░██░░░░░░░░░░░░░░░░▓███▓░█████████▒▒▒█▓
░░░██░░░░░░░░░░░░░░░░░░░░░░░░▓███▒▒▒▒▒▒▓██
░░██░░░░░░░░░░░░░░░░░░░░░░░░░░░░███▓█████
░░██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓███▓░░██
░░██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██▓
░▓██▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████
█████░░░░▓██▓░░░░░░░░░░░░░░░░▓██▓░░░░░░██
░░██░░░░░░████░░░░░░░░░░░░░░░░████░░░░░███▓
░░████░░░░░██░░░░░░░█████░░░░░░██░░░░░░▓████
█████░░░░░░░░░░░░░░░██░██░░░░░░░░░░░░░░██
░░░░████▓░░░░░░░░░░░░███░░░░░░░░░░░░░██e█▓
░░░▓████▓░░░░░░░░▓████░░░░░░░░░░░░░░▓███▓███
░▓██▓░░████▓░░▓████▓░██░░░░░░░░░░▓████
░░░░░░░░░░██████▓░░░░██░░░░▓███████▓
░░░░░░░░░██▓▒▒█░░░░░░░██████████████▓
░░░░░░░░██▒▒▒▓█░░░░░░░██░░██▒▒▒██▒▒▒███▓
░░░░░░░░██▒▒▒▒██░░░░░▓█▓██▓▒▒▒▒▒██▒▓█████
░░░░░░░░░███▓█▓███████▓▒▒▒▒▓███▓░███▓░░░██
░░░░░░░░░█▒▒██░██▒▒▒▒▒▒▒▒▒▒██▒██s▓█░░░░░██
░░░░░░░░██▒▒▒███▒▒▒▒▒▒▒▒▒▒▒▒███▒▒▒██░░░░▓█
░░░░░░░░██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██░░░███
░░░░░░░░█▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█████▓
░░░░░░░▓█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██
░░░░░░░██▓▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒██
░░░░░░░██████████████████████████████
░░░░░░░██░░░░░░░░░░░░██░░░░░░░░░░░░██
░░░░░░░░██░░░░░░░░░░░██░░░░░░░░░░░██
░░░░░░░░░██░░░░░░░░░░██░░░░░░░░░░██
░░░░░░░░░░████████████████████████
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10972
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Köra Python-program med UTF-8 teckenkodning som default

Inlägg03 okt 2014, 14:15

Att hantera teckenkodning är inte alltid uppenbart.

Ett väldigt kort och konkret svar finner du här: http://stackoverflow.com/a/6362647/341137

Problemet i fallet ovan med bilden är att python inte använder UTF-8 för att skriva ut tecknen till terminalen. Trots att vi tycker att vi sagt till Python att göra det. Tydligen har vi inte sagt till tillräckligt.

För den som vill testa så finns här ett testprogram att leka med (jag döpte det till encoding.py).

Kod: Markera allt
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import locale
import os

print("Default encoding is (sys.getdefaultencoding()): ", sys.getdefaultencoding())
print("(sys.stdin.encoding):                           ", sys.stdin.encoding)
print("(sys.stdout.encoding):                          ", sys.stdout.encoding)
print("(sys.stderr.encoding):                          ", sys.stderr.encoding)

print("Default locale is (locale.getdefaultlocale()):  ", locale.getdefaultlocale())

print("Environment variable PYTHONIOENCODING: ", os.environ.get("PYTHONIOENCODING"))
print("Environment variable LANG:             ", os.environ.get("LANG"))
print("Environment variable LC_CTYPE:         ", os.environ.get("LC_CTYPE"))

print("\u03b1\u03b2\u03b3")
print("░")


När det "fungerar" skall följande skrivas ut i slutet och det skall inte bli ett felmeddelande.

αβγ



Möjligt felmeddelande är:

Kod: Markera allt
$ python3 encoding.py
Default encoding is (sys.getdefaultencoding()):  utf-8
(sys.stdin.encoding):                            ANSI_X3.4-1968
(sys.stdout.encoding):                           ANSI_X3.4-1968
(sys.stderr.encoding):                           ANSI_X3.4-1968
Default locale is (locale.getdefaultlocale()):   (None, None)
Environment variable PYTHONIOENCODING:  None
Environment variable LANG:              None
Environment variable LC_CTYPE:          None
Traceback (most recent call last):
  File "m.py", line 19, in <module>
    print("\u03b1\u03b2\u03b3")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)


Så här ser det ut när jag testkör det med olika inställningar på environmentvariablerna på min Debian.



Här är två andra exempel som du kan testa för att se hur ditt system hanterar teckenkodningen tillsammans med python, båda bör fungera, annars testa igen genom att sätta en environmentvariabel som säger till Python att använda UTF-8 som standard teckenkodning.

Kod: Markera allt
python3 -c 'print("\u03b1\u03b2\u03b3")'
python3 -c 'print("\u03b1\u03b2\u03b3")' | less




Källa (diskuterar hur python2 skall fungera på Feodora): https://fedoraproject.org/wiki/Features ... stemLocale

Slutsats:
Taget detta i beaktning, så verkar det smart att sätta något av följande i sin startupfil så att Python använder UTF-8 som default encoding.

Kod: Markera allt
setenv PYTHONIOENCODING UTF-8
setenv LANG C.UTF-8
setenv LC_CTYPE C.UTF-8


Dubbelkolla att du har den valda localen installerad på datorn.

Kod: Markera allt
$ locale -a
...
..:
.... /mos

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 7 gäster