2016-12-31 6 views
4

Я только начал изучать Python, но я уже столкнулся с проблемами.
У меня есть простой скрипт, с помощью только одной команды:Python 3 UnicodeEncodeError: кодек 'ascii' не может кодировать символы

#!/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("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) 

Я использую 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.
Итак, у меня есть исходный файл с сохраненным идентификатором UTF-8, Konsole установлен в UTF-8, но я все еще получаю ошибку!
Даже если добавить

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

начала она ничего не делает.

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

Любые идеи для решения этой проблемы? Спасибо.

+1

Это звучит как среда не настроена правильно для UTF-8. Вот почему Python по умолчанию выполняет 'ascii' при печати Unicode. –

+0

Возможный дубликат [UnicodeEncodeError при записи в файл] (http://stackoverflow.com/questions/32924147/unicodeencodeerror-when-writing-to-file) –

+0

Ваша локаль должна быть разбита. Возможно, ваш .bashrc устанавливает 'LANG = cs_CZ.UTF-8', но вы не создали/не установили чешский язык? Python по умолчанию будет кодировать ASCII, если ваш язык сломан или отсутствует. Причина, по которой он работает в Python 2, состоит в том, что строка является байтовой строкой и будет просто записана непосредственно на ваш терминал. Python 3 необходимо будет кодировать строки при записи на терминал –

ответ

4

Благодаря Марк Толен и Аластер Маккормак за предположение, где эта проблема может быть. Проблема была действительно в настройках локали.
Когда я побежал 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" значение по умолчанию, которое использует CharMap ANSI. И вот в чем проблема. Запуск locale charmap дал мне: ANSI_X3.4-1968, который не может отображать символы, отличные от английского.
Я исправил это, используя этот Ubuntu documentation site.

Я добавил эти строки в /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 
Смежные вопросы