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 ответ:
СпасибоМарку Толену иАластеру Маккормаку за предположение, где может быть проблема. Проблема была действительно в настройках локали.
Когда я запустил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