Страницы

Поиск по вопросам

понедельник, 2 декабря 2019 г.

Python 3 и русские символы: print('Всем привет!') ведёт к UnicodeEncodeError: 'ascii' codec can't encode… ошибке

#python #linux #кодировка #python_3x


Пишу обычную программу print('Всем привет!') и запускаю python3.4 main.py, а в ответ:


  Traceback (most recent call last):
  File "main.py", line 1, in 
      print('\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!')
  UnicodeEncodeError: 'ascii' codec
  can't encode characters in position
  0-3: ordinal not in range(128)


Система:


  webapp: ~/Applications $ uname -a
  Linux webapp 3.13.0-29-generic 
  
  53-Ubuntu SMP Wed Jun 4 21:00:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

    


Ответы

Ответ 1



В начале файла добавьте: #!/usr/bin/env python # -*- coding: utf-8 -*- # vim:fileencoding=utf-8

Ответ 2



Питон использует кодировку терминала для печати, которая не имеет никакого отношения к sys.getdefaultencoding(). Иногда переменные окружения, определяющие язык, такие как LANGUAGE, LC_ALL,LC_CTYPE, LANG могут быть не установлены, например, в окружении используемом ssh, upstart, Salt, mod_wsgi, crontab, etc. В этом случае используется C (POSIX) локаль, которая использует ascii кодировку, что приводит к UnicodeEncodeError ошибке, т.к. русские буквы не представимы в ascii. В Python 3.7, реализована PEP 540: Forced UTF-8 Runtime Mode: utf-8 режим включается по умолчанию для "C" локали. Серверные варианты Linux могут использовать C локаль по умолчанию. Настольные инсталяции дитрибутивов Linux обычно имеют utf-8 локаль. Ошибка в вопросе связана с Питон багом: Python 3 raises Unicode errors with the C locale. Разработчики решили следовать ascii кодировке из C локали, даже если это ошибка в подавляющем большинстве случаев, но в Python 3.7 ситуация может улучшится в поведении по умолчанию, см. PEP 538 -- Coercing the legacy C locale to a UTF-8 based locale. Чтобы временно изменить используемую кодировку можно определить PYTHONIOENCODING: $ PYTHONIOENCODING=utf-8 python your-script.py В качестве более постоянного решения, нужно убедиться что используется utf-8 локаль в окружении, которое запускает python. Не обязательно русскую локаль устанавливать, чтобы напечатать русский текст. В этом достоинство Юникода, что можно работать с многими языками одновременно. Например, существует C.UTF-8 локаль. Если locale -a не показывает ни одной utf-8 локали, то на Debian системах следует установить locales пакет и выбрать utf-8 локаль для использования: root# aptitude install locales root# dpkg-reconfigure locales Индивидульно, каждый пользователь может настроить переменные окружения (см. Не сохраняются переменные XUBUNTU ), например: export LANG=en_US.UTF-8 Используется первая доступная переменная из списка: LC_ALL, LC_CTYPE, LANG. Может потребоваться сконфигурировать для работы с utf-8 индивидуальные программы, такие как xterm, Gnome Terminal, screen, отдельно.

Комментариев нет:

Отправить комментарий