2016-12-31 4 views
4

Ich habe gerade begonnen, Python zu lernen, aber ich lief bereits in Schwierigkeiten.
Ich habe ein einfaches Skript mit nur einem Befehl:Python 3 UnicodeEncodeError: 'Ascii' Codec kann Zeichen nicht kodieren

#!/usr/bin/env python3 
print("Příliš žluťoučký kůň úpěl ďábelské ódy.") # Text in Czech 

Wenn ich versuche, dieses Skript auszuführen:

python3 hello.py 

ich diese Meldung:

Traceback (most recent call last): 
    File "hello.py", line 2, in <module> 
    print("P\u0159\xedli\u0161 \u017elu\u0165ou\u010dk\xfd k\u016fn \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy.") 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128) 

ich Kubuntu bin mit 16.04 und Python 3.5.2. Als ich das versuchte: export PYTHONIOENCODING=utf-8 Es funktionierte aber nur vorübergehend. Das nächste Mal, als ich bash öffnete, bekam ich den gleichen Fehler.

Gemäß https://docs.python.org/3/howto/unicode.html#the-string-type ist die Standardcodierung für Python-Quellcode UTF-8.
Also habe ich die Quelldatei ID UTF-8 gespeichert, Konsole ist auf UTF-8 eingestellt, aber ich bekomme immer noch den Fehler!
Auch wenn ich

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

zum Anfang hinzufügen tut es nichts.

Eine andere seltsame Sache: wenn ich es nur mit Python, nicht mit Python3, es funktioniert. Wie ist es möglich, in Python 2.7.12 und nicht in 3.5.2 zu arbeiten?

Irgendwelche Ideen, um das dauerhaft zu lösen? Vielen Dank.

+1

Es klingt wie Ihre Umgebung nicht richtig für UTF-8 konfiguriert ist. Deshalb verwendet Python beim Drucken von Unicode standardmäßig 'ASCII'. –

+0

Mögliches Duplikat von [UnicodeEncodeError beim Schreiben in Datei] (http://stackoverflow.com/questions/32924147/unicodeencodeerror-when-writing-to-file) –

+0

Ihr Gebietsschema muss beschädigt sein. Vielleicht setzt Ihre .bashrc 'LANG = cs_CZ.UTF-8', aber Sie haben das tschechische Gebietsschema nicht erstellt/installiert? Python verwendet standardmäßig die ASCII-Codierung, wenn das Gebietsschema unterbrochen ist oder fehlt. Der Grund, warum es in Python 2 funktioniert, ist, dass die Zeichenfolge eine Byte-Zeichenfolge ist und einfach direkt in Ihr Terminal geschrieben wird. Python 3 muss Zeichenfolgen beim Schreiben in das Terminal codieren. –

Antwort

4

Dank Mark Tolen und Alastair McCormack für was darauf hindeutet, wo das Problem sein kann. Das Problem lag wirklich in den Ländereinstellungen.
Als ich locale lief, war der Ausgang:

LANG=C 
LANGUAGE= 
LC_CTYPE="C" 
LC_NUMERIC=cs_CZ.UTF-8 
LC_TIME=cs_CZ.UTF-8 
LC_COLLATE=cs_CZ.UTF-8 
LC_MONETARY=cs_CZ.UTF-8 
LC_MESSAGES="C" 
LC_PAPER="C" 
LC_NAME="C" 
LC_ADDRESS="C" 
LC_TELEPHONE="C" 
LC_MEASUREMENT=cs_CZ.UTF-8 
LC_IDENTIFICATION="C" 
LC_ALL= 

Die "C" ist die Standardeinstellung, die den ANSI charmap verwendet. Und da war das Problem. Running locale charmap gab mir: ANSI_X3.4-1968, die nicht-Englisch Zeichen nicht anzeigen kann.
Ich habe dies mit dieser Ubuntu documentation site behoben.

Ich habe diese Zeilen /etc/default/locale:

LANGUAGE=cs_CZ.UTF-8 
LC_ALL=cs_CZ.UTF-8 

Dann müssen Sie Ihre Sitzung neu zu starten (abmelden und in), um diese Einstellungen zu übernehmen.

Lauf locale jetzt gibt diese Ausgabe:

LANG=C 
LANGUAGE=cs 
LC_CTYPE="cs_CZ.UTF-8" 
LC_NUMERIC="cs_CZ.UTF-8" 
LC_TIME="cs_CZ.UTF-8" 
LC_COLLATE="cs_CZ.UTF-8" 
LC_MONETARY="cs_CZ.UTF-8" 
LC_MESSAGES="cs_CZ.UTF-8" 
LC_PAPER="cs_CZ.UTF-8" 
LC_NAME="cs_CZ.UTF-8" 
LC_ADDRESS="cs_CZ.UTF-8" 
LC_TELEPHONE="cs_CZ.UTF-8" 
LC_MEASUREMENT="cs_CZ.UTF-8" 
LC_IDENTIFICATION="cs_CZ.UTF-8" 
LC_ALL=cs_CZ.UTF-8 

und läuft locale charmap kehrt:

UTF-8 
Verwandte Themen