Python 3 UnicodeEncodeError: кодек "ascii" не может кодировать символы


Я только начал изучать Python, но уже столкнулся с проблемами.
У меня есть простой скрипт с одной командой:

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

Когда я пытаюсь запустить этот скрипт:

python3 hello.py 

Я получаю следующее сообщение:

Traceback (most recent call last):
  File "hello.py", line 2, in <module>
    print("Pu0159xedliu0161 u017eluu0165ouu010dkxfd ku016fn xfapu011bl u010fxe1belskxe9 xf3dy.")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)

Я использую Kubuntu 16.04 и Python 3.5.2. Когда я попробовал это: export PYTHONIOENCODING=utf-8 это сработало, но только временно. В следующий раз, когда я открыл bash, я получил ту же ошибку.

Согласно https://docs.python.org/3/howto/unicode.html#the-string-type значение по умолчанию кодировка для исходного кода Python-UTF-8.
Таким образом, у меня есть исходный файл сохраненный id UTF-8, Konsole установлен в UTF-8, но я все равно получаю ошибку!
Даже если я добавлю

# -*- coding: utf-8 -*-
До самого начала он ничего не делает.

Еще одна странная вещь:когда я запускаю его, используя только python, а не python3, он работает. Как можно работать в Python 2.7.12, а не в 3.5.2?

Есть идеи, как решить эту проблему навсегда? Спасибо.

1 6

1 ответ:

СпасибоМарку Толену иАластеру Маккормаку за предположение, где может быть проблема. Проблема была действительно в настройках локали.
Когда я запустил locale, выход был:

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=

Эта" C " является настройкой по умолчанию, которая использует диаграмму ANSI. И вот тут-то и возникла проблема. Запуск locale charmap дал мне: ANSI_X3.4-1968, который не может отображать неанглийские символы.
Я исправил это, используя этотсайт документации Ubuntu .

Я добавил Эти строки to /etc/default/locale:

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

Затем вы должны перезапустить сеанс (выйти и войти), чтобы применить эти настройки.

Запуск locale теперь возвращает этот вывод:

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

И запуск locale charmap возвращает:

UTF-8