В моем скрипте Python, запущенном в командной строке на Ubuntu, он выбирает содержимое в кодировке UTF8 из базы данных MySQL.
Затем я хочу напечатать строку на консоли.
Отображаемые строки имеют проблему с кодировкой, так как они не отображают символы с акцентом правильно. Как это исправить?
Предпочтительно сценарий будет принимать решение, а не устанавливать системную среду, для обеспечения простой работы в других системах.
Настоятельно рекомендуется, чтобы вы не использовали "?" в качестве замены. Просто установите кодировку вывода в UTF-8 и сделайте с ней.
for s in ("stdin","stdout","stderr"):
setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
В качестве альтернативы, установите PYTHONIOENCODING
envariable в utf8, чтобы python не догадывался о выходной кодировке.
Любой подход бесконечно намного лучше, чем ручное кодирование, что глупо.
Если вы откажетесь перейти на Python3, я также рекомендую
from __future__ import unicode_literals
чтобы изгнать всю эту глупую u'...'
вещи.
В последнее время я начинаю все мои прогамы Python следующим образом:
#!/usr/bin/env python3.2
# -*- coding: UTF-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
import re
import sys
import os
if not (("PYTHONIOENCODING" in os.environ)
and
re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)):
sys.stderr.write(sys.argv[0] + ": Please set your PYTHONIOENCODING envariable to utf8\n")
sys.exit(1)
import unicodedata
if unicodedata.unidata_version < "6.0.0":
print("WARNING: Your old UCD is out of date, expected at least 6.0.0 but got",
unicodedata.unidata_version)
wide_enough = (sys.maxunicode >= 0x10FFFF)
if not wide_enough:
print("WARNING: Narrow build detected, your Python lacks full Unicode support!!")
import re import sys import os if not (("PYTHONIOENCODING" in os.environ) and re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)): sys.stderr.write(sys.argv[0] + ": Please set your PYTHONIOENCODING envariable to utf8\n") sys.exit(1)
Были зависимости импорта, которые я не смог найти, чтобы получить ваш первый бит кода работает.
Вы можете получить текущую кодировку STDOUT следующим образом:
>>> import sys
>>> sys.stdout.encoding
UTF-8
Затем закодируйте свою строку Unicode следующим образом:
>>> u"Ä"
u'\xc4'
>>> sys.stdout.write(u"Ä".encode(enc, 'replace'))
"Replace " позволяет избежать UnicodeEncodeErrors, когда символ не отображается в терминальной кодировке. Затем он будет заменен вопросительным знаком.
Входная кодировка текста (utf-8 здесь) не имеет значения. Вы должны как можно скорее преобразовать utf8-bytestring в Unicode, чтобы напечатать текст:
print(unicode_text)
sys.stdout
чтобы закодировать текст, используя utf8 для вас Кодировка вывода определяется средой, которая запускает ваш скрипт на основе настроек локали (LANG
, LC_CTYPE
, LC_ALL
) или PYTHONIOENCODING
envvar. Не выводить utf8 безоговорочно.
Например, если локаль не установлена; вы можете указать его явно:
$ LANG=en_US.utf8 python your_script.py
Убедитесь, что ваш терминал способен отображать соответствующие символы Юникода (установлены шрифты, соответствующие локали (locale -a
)).
Другими словами, чтобы исправить выход, исправьте среду, например, настройте настройки языка для использования C.UTF-8
по умолчанию.