печать UTF-8 в Python 3 с использованием Sublime Text 3

у меня есть этот код Python3, чтобы попытаться прочитать и распечатать из файла в кодировке utf-8:

f = open('mybook.txt', encoding='utf-8')
for line in f:
    print(line)

когда я строю с помощью Sublime Text 3, я получаю следующую ошибку:

UnicodeEncodeError: 'ascii' codec can't encode character 'u2019' in position 18: ordinal not in range(128)

однако он работает, когда я просто выполняю свой код в терминале с python3.

моя конфигурация сборки

{
"cmd": ["/usr/local/bin/python3", "$file"]
, "selector": "source.python"
, "file_regex": "file "(...*?)", line ([0-9]+)"
}

если я изменю его на:

f = open('mybook.txt', encoding='utf-8')
for line in f:
    print(line.encode('utf-8'))

затем он печатает строку байта в кодировке utf-8 (я думаю, что это то, что событие.)

b'Hellon'
b'xc2xabxe2x80xa2n'
b'Goodbye'

но я также не знаю, как перейти от этого к печати символов Юникода на экране...

кроме того, если я попытаюсь изменить эту переменную env согласно программа python не выполняется в sublime text 3, но успех в bash это все еще не исправить.

3 ответов


ответ был на самом деле в вопросе, связанном в вашем вопросе -PYTHONIOENCODING необходимо указать "utf-8". Однако, поскольку OS X глупо и не подбирает переменные среды, установленные в терминале или через .bashrc или аналогичные файлы, это не будет работать так, как указано в ответе на другой вопрос. Вместо этого вам нужно передать эту переменную среды в Sublime.

к счастью, системы сборки ST3 (я не знаю о ST2) имеют "env". Этот является словарем ключей и значений, переданных в exec.py, который отвечает за запуск систем сборки без "target" установить вариант. Как обсуждалось в наших комментариях выше, я указал, что ваша примерная программа отлично работала с текстовым файлом UTF-8, содержащим символы, отличные от ASCII, при запуске со ST3 (Build 3122) в Linux, но не с той же версией, запущенной на OS X. Все, что было необходимо для ее запуска, - это изменить систему сборки, чтобы включить эту строку:

"env": {"PYTHONIOENCODING": "utf8"},

я спас построить систему, нажмите B, и программа работала нормально.

кстати, если вы хотите прочитать exec.py или Packages/Python/Python.sublime-build, или любой другой файл упакован в .sublime-package архив, установить PackageResourceViewer через Управление пакетом. Используйте опцию " Открыть ресурс "в палитре команд для выбора отдельных файлов или" извлечь пакет "(оба предшествуют" PackageResourceViewer:", или prv использование нечеткого поиска) для извлечения весь пакет для вашего Packages папка, доступ к которой осуществляется путем выбора Sublime Text → Preferences → Browse Packages… (всего Preferences → Browse Packages… на других операционных системах). Он расположен на вашем жестком диске в следующем месте:

  • Linux:~/.config/sublime-text-3/Packages
  • OS X:~/Library/Application Support/Sublime Text 3/Packages
  • Обычная Установка Windows:C:\Users\YourUserName\AppData\Roaming\Sublime Text 3\Packages
  • Установка Windows Portable:InstallationFolder\Sublime Text 3\Data\Packages

как только файлы будут сохранены в вашем (если вы просто просмотрите их с помощью опции "открыть ресурс" и закройте без изменения или сохранения, их не будет), они переопределят файл с идентичным именем, содержащийся в .sublime-package архиве. Так, например, если вы хотите изменить значение по умолчанию на Python пакета, ваши изменения будут сохранены как Packages/Python/Python.sublime-build, и когда вы выберите Python build system из меню, он будет использовать только вашу версию.


он работает, спасибо, полный скрипт системы сборки для Sublime Text 3

Инструмент - > Система Сборки - > Новая Система Сборки

{
    "shell_cmd": "python \"$file\"",
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "env": {"PYTHONIOENCODING": "utf8"}
}

Примечание Если вы используете venv с S3, вам нужно будет обновить Python + Virtualenv.возвышенное-создать файл ресурсов.

{
    "target": "virtualenv_exec",
    "shell_cmd": "python -u \"$file\"",
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "env": {"PYTHONIOENCODING": "utf-8"}
}