- Как напечатать текст в кодировке UTF-8 на консоли в Python PYTHONIOENCODING . Но похоже, что Python игнорирует это. По крайней мере, в моей системе я продолжаю получать ascii в качестве кодировки по умолчанию, даже после установки envvar .
- Обходной путь
- 4 ответа
- Установка правильной кодировки при передаче стандартного вывода в Python
- Установка правильной кодировки при передаче stdout в Python
- 10 ответов:
Как напечатать текст в кодировке UTF-8 на консоли в Python PYTHONIOENCODING . Но похоже, что Python игнорирует это. По крайней мере, в моей системе я продолжаю получать ascii в качестве кодировки по умолчанию, даже после установки envvar .
Если я делаю следующее в начале скрипта, он работает, хотя:
Но такой подход кажется нечистым . Итак, что хорошего способа сделать это?
Обходной путь
Вместо того, чтобы изменить кодировку по умолчанию — что не очень хорошая идея (см. Ответ mesilliac) — я просто обертываю sys.stdout StreamWriter следующим образом:
См. эту суть, чтобы найти небольшую служебную функцию, которая ее обрабатывает.
4 ответа
Как напечатать текст в кодировке UTF-8 на консоли в Python LANG , LC_CTYPE ) указывают локаль utf-8 и поэтому (теоретически) вы можете напечатать строку байтов utf-8 напрямую и должен правильно отображаться в вашем терминале (если настройки терминала в соответствии с настройками локали, и они должны быть), но вы следует избегать этого: не жестко кодируйте кодировку вашего среда внутри вашего скрипта ; печатайте Unicode напрямую .
В вашем вопросе много ошибочных предположений.
Вам не нужно устанавливать PYTHONIOENCODING с вашими настройками локали, распечатать Unicode в терминал. Язык utf-8 поддерживает все символы Unicode, то есть работает как есть.
Вам не нужно обходное решение sys.stdout = codecs.getwriter ( locale.getpreferredencoding ( )) ( sys.stdout ) . Это может сломаться, если некоторый код (который вы не контролируете) действительно должен печатать байты и / или он может сломаться, пока печать Unicode в консоль Windows (неправильная кодовая страница, не может печатать некодируемые символы). Достаточно правильных настроек локали и / или PYTHONIOENCODING envvar. Кроме того, если вам нужно заменить sys.stdout , то используйте <
sys.getdefaultencoding() не связан с вашими настройками локали и PYTHONIOENCODING . Ваше предположение, что настройка PYTHONIOENCODING должно измениться sys.getdefaultencoding() неверно. Вам следует проверьте sys.stdout.encoding вместо этого.
sys.getdefaultencoding() не используется при печати на приставка. Может использоваться как запасной вариант на Python 2, если stdout перенаправляется в файл / канал, если PYTHOHIOENCODING не установлен:
Не звоните sys.setdefaultencoding(«UTF-8») ; это может испортить ваш данные без вывода сообщений и / или прерывание сторонних модулей, которые не ожидают Это. Помните, sys.getdefaultencoding() используется для преобразования строк тестирования ( str ) в / из unicode в Python 2 неявно , например, «a» + u»b» . Смотрите также, цитата в ответе @ mesilliac.
Вот как я это делаю:
Обратите внимание на -S в полосе. Это говорит Python не импортировать модуль site автоматически. Модуль site устанавливает кодировку по умолчанию и удаляет метод, чтобы его нельзя было установить снова. Но почтить то, что уже установлено.
Если программа не отображает соответствующие символы на экране, то есть недопустимый символ, запустите программу с помощью следующей командной строки:
Или следующее, если ваша программа является глобально установленным модулем:
На некоторых платформах, таких как Cygwin ( mintty.exe терминал) с Anaconda Python (или Python 3 ), просто запустите export PYTHONIOENCODING=utf8 и позже запустить программу не получится, и вы должны всегда делать PYTHONIOENCODING=utf8 yourprogram каждый раз, чтобы правильно запустить программу.
В Linux, в случае sudo , вы можете попытаться передать аргумент -E для экспорта пользовательских переменных в процесс sudo:
Если вы попробуете это, и это не сработало, вам нужно будет войти в оболочку sudo:
Кажется, достигать этого не рекомендуется.
Fedora предложила использовать системный языковой стандарт по умолчанию, но, видимо, это ломает другие вещи.
Источник
Установка правильной кодировки при передаче стандартного вывода в Python
При передаче вывода программы Python интерпретатор Python запутывается в кодировании и устанавливает для него значение None. Это означает такую программу:
будет нормально работать при нормальной работе, но не с:
UnicodeEncodeError: кодек ‘ascii’ не может кодировать символ u ‘\ xa0’ в позиции 0: порядковый номер не в диапазоне (128)
при использовании в последовательности труб.
Каков наилучший способ сделать эту работу при обвязке? Могу ли я просто сказать ему использовать любую кодировку оболочки / файловой системы / что бы она ни использовала?
Советы, которые я видел до сих пор, это изменить ваш site.py напрямую или жестко закодировать код по умолчанию с помощью этого хака:
Есть ли лучший способ заставить трубопровод работать?
Ваш код работает при запуске в скрипте, потому что Python кодирует выходные данные в любую кодировку, используемую вашим терминальным приложением. Если вы используете трубопровод, вы должны закодировать его самостоятельно.
Практическое правило: всегда используйте Unicode для внутреннего использования. Расшифруйте то, что вы получаете, и закодируйте то, что вы отправляете.
Другим дидактическим примером является программа на Python, которая конвертирует между ISO-8859-1 и UTF-8, делая все в верхнем регистре между ними.
Установка системной кодировки по умолчанию — плохая идея, потому что некоторые модули и библиотеки, которые вы используете, могут полагаться на факт, что это ASCII. Не делай этого.
Во-первых, относительно этого решения:
Непрактично каждый раз явно печатать с заданной кодировкой. Это было бы повторяющимся и подверженным ошибкам.
Лучшее решение — изменить sys.stdout в начале вашей программы кодирование с выбранной кодировкой. Вот одно решение, которое я нашел на Python: Как выбрать sys.stdout.encoding? , в частности комментарий от «Тока»:
Вы можете попробовать изменить переменную среды «PYTHONIOENCODING» на «utf_8». Я написал страницу в моем испытании с этой проблемой .
Tl; dr поста в блоге:
сделать работу, но не могу установить ее на самом Python .
то, что мы можем сделать, это проверить, если не установлен, и сказать пользователю установить его перед вызовом скрипта с помощью:
Обновление, чтобы ответить на комментарий: проблема просто существует при передаче на стандартный вывод. Я тестировал в Fedora 25 Python 2.7.13
работает ./b.py | Меньше
У меня была похожая проблема на прошлой неделе . Это было легко исправить в моей IDE (PyCharm).
Вот мое исправление:
Начиная с строки меню PyCharm: Файл -> Настройки . -> Редактор -> Кодировки файлов, затем установите: «Кодировка IDE», «Кодировка проекта» и «Кодировка по умолчанию для файлов свойств» ВСЕ в UTF-8, и теперь она работает Как колдовство.
Надеюсь это поможет!
Спорная санированная версия ответа Крейга МакКуина.
Я мог бы «автоматизировать» это с помощью вызова:
Да, здесь можно получить бесконечный цикл, если этот «setenv» не работает.
Я просто подумал, что упомяну здесь кое-что, с чем мне пришлось долго экспериментировать, прежде чем я наконец понял, что происходит. Это может быть настолько очевидным для всех здесь, что они не потрудились упомянуть об этом. Но это помогло бы мне, если бы они имели, так по этому принципу .
NB: я использую Jython специально, v 2.7, так что, возможно, это не относится к CPython .
NB2: первые две строки моего файла .py здесь:
Механизм построения строки «%» (AKA «оператор интерполяции») также вызывает ДОПОЛНИТЕЛЬНЫЕ проблемы . Если кодировка «среды» по умолчанию — ASCII, и вы пытаетесь сделать что-то вроде
У вас не будет проблем с запуском в Eclipse . В CLI Windows (окно DOS) вы обнаружите, что кодировка — это кодовая страница 850 (моя ОС Windows 7) или что-то подобное, которая может обрабатывать европейские символы с акцентом по крайней мере, поэтому буду работать
тоже будет работать.
Если, OTOH, вы перенаправляете файл из CLI, кодировкой stdout будет None, которая по умолчанию будет ASCII (в любом случае, в моей ОС), которая не сможет обрабатывать ни один из вышеперечисленных отпечатков . (страшная кодировка ошибка).
Итак, вы можете подумать о перенаправлении стандартного вывода с помощью
и попробуйте запустить в CLI трубопровод к файлу . Как ни странно, печать A выше будет работать . Но печать B выше вызовет ошибку кодирования! Следующее, однако, будет работать нормально:
Вывод, к которому я пришел (условно), заключается в том, что если строка, указанная как строка Unicode с префиксом «u», передается механизму% -обработки, то она, по-видимому, предполагает использование кодировки среды по умолчанию, независимо от установили ли вы stdout для перенаправления!
Как люди справляются с этим — вопрос выбора. Я хотел бы, чтобы эксперт по Unicode рассказал, почему это происходит, правильно ли я понял это, каким образом это предпочтительное решение, применимо ли это также к CPython , происходит ли это в Python 3 и т. Д., И т. Д., И т. Д.
Источник
Установка правильной кодировки при передаче stdout в Python
при передаче вывода программы Python интерпретатор Python запутывается в кодировке и устанавливает ее в None. Это означает такую программу:
будет работать нормально при нормальной работе, но не с:
UnicodeEncodeError: кодек ‘ascii’ не может кодировать символ u ‘xa0 ‘ в позиции 0: порядковый номер не в диапазоне (128)
при использовании в последовательности трубы.
каков наилучший способ сделать эту работу при прокладке трубопроводов? Могу ли я просто сказать ему использовать любую кодировку оболочки/файловой системы/что-то использует?
предложения, которые я видел до сих пор, чтобы изменить ваш site.py непосредственно, или жестко кодирование defaultencoding с помощью этого хака:
есть ли лучший способ заставить трубопроводы работать?
10 ответов:
ваш код работает при запуске в скрипте, потому что Python кодирует вывод в любую кодировку, которую использует ваше терминальное приложение. Если вы трубите, вы должны закодировать его самостоятельно.
эмпирическое правило: Всегда используйте Unicode внутренне. Декодируйте то, что вы получаете, и кодируйте то, что вы посылаете.
установка системное кодирование по умолчанию-плохая идея, потому что некоторые модули и библиотеки, которые вы используете, могут полагаться на то, что это ASCII. Не делай этого.
во-первых, относительно этого решения:
нецелесообразно явно печатать с заданной кодировкой каждый раз. Это было бы повторяющимся и подверженным ошибкам.
лучшее решение-это изменить sys.stdout в начале вашей программы, чтобы кодировать с выбранной кодировкой. Вот одно решение, которое я нашел на Python: как это sys.стандартный вывод.кодировка выбрана?, в частности комментарий «toka»:
вы можете попробовать изменить переменную среды «PYTHONIOENCODING» на » utf_8.»Я написал страница о моем испытании с этой проблемой.
Tl; dr сообщения в блоге:
сделайте работу, но не можете установить ее на самом python .
что мы можем сделать, это проверить, если это не установка и сказать пользователю, чтобы установить его перед вызовом скрипта с :
обновление, чтобы ответить на комментарий: проблема просто существует, когда трубопровод к stdout . Я тестировал в Fedora 25 Python 2.7.13
вот мое исправление:
начиная с панели меню PyCharm: File — > Settings. — >Редактор — > кодировки файлов, затем установите: «кодировка IDE», «кодировка проекта» и «кодировка по умолчанию для файлов свойств» все в UTF-8, и теперь она работает как шарм.
надеюсь, что это помогает!
спорная санированная версия ответа Крейга Маккуина.
Я мог бы «автоматизировать» его с вызовом:
Да, здесь можно получить бесконечный цикл, если этот «setenv» не работает.
Я просто подумал, что упомяну здесь кое-что, с чем мне пришлось долго экспериментировать, прежде чем я, наконец, понял, что происходит. Это может быть настолько очевидно для всех здесь, что они не потрудились упомянуть об этом. Но это помогло бы мне, если бы они это сделали, так что по этому принципу.
NB: я использую Jython в частности, v 2.7, так что, возможно, это не относится к CPython.
особое примечание 2: первые две строки мои .файл py вот они:
механизм построения строки «%» (он же «оператор интерполяции») также вызывает дополнительные проблемы. Если кодировка по умолчанию «среды» является ASCII, и вы пытаетесь сделать что-то вроде
вы не будете иметь никаких проблем с запуском в Eclipse. В Windows командной строки (окно DOS) вы увидите, что кодирование-это кодовая страница 850 (моя ОС Windows 7) или что-то подобное, которое может обрабатывать европейские акцентированные символы, по крайней мере, так это сработает.
также будет работать.
если, OTOH, вы направляетесь к файлу из CLI, кодировка stdout будет None, которая по умолчанию будет ASCII (в моей ОС в любом случае), которая не сможет обрабатывать ни один из вышеупомянутых отпечатков. (страшная ошибка кодирования).
тогда вы можете подумать о перенаправлении вашего stdout с помощью
и попробуйте запустить в трубопроводе CLI к файлу. Очень странно, что печать выше будет работать. Но печать в выше выбросит ошибку кодирования! Однако следующее будет работать нормально:
вывод, к которому я пришел (условно), заключается в том, что если строка, которая указана как Unicode строка, использующая префикс «u», передается в механизм %-обработки, который, как представляется, включает использование кодировки среды по умолчанию,независимо от того, установили ли вы stdout для перенаправления!
как люди справляются с этим-это вопрос выбора. Я бы добро пожаловать эксперт Unicode, чтобы сказать, почему это происходит, не ошибся ли я в чем-то, какое предпочтительное решение для этого, применяется ли оно также к CPython, произошло ли это в Python 3, и т. д., прием.
на Ubuntu 12.10 и Терминале GNOME ошибка не возникает, когда программа печатает в stdout или подключается к трубе для других программ. И кодирование файлов, и кодирование терминала — UTF-8.
какую ОС и эмулятор терминала вы используете? Я слышал, что некоторые из моих коллег были подобные проблемы при использовании iTerm 2 и OS X; iTerm 2 может быть виновником.
обновление: этот ответ неверен — см. Комментарий к подробности
я столкнулся с этой проблемой в устаревшей программе, и было трудно определить, где что было напечатано. Я помог себе с этим Хак:
поверх моего сценария, test.py:
обратите внимание, что это изменяет все вызовы для печати, чтобы использовать кодировку, так что ваша консоль будет печатать это:
Источник