Отображение строк UTF8 в терминале Ubuntu с помощью скрипта Python - PullRequest
1 голос
/ 11 августа 2011

В моем скрипте Python, выполняемом в командной строке в Ubuntu, он выбирает кодированный в UTF8 контент из базы данных MySQL.

Затем я хочу вывести строку на консоль.

В отображаемых строках есть проблема с кодировкой, так как они неправильно показывают акцентированные символы. Как мне это исправить?

Предпочтительно, чтобы сценарий принимал решение, а не устанавливал системную среду, чтобы обеспечить легкую работу в других системах.

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Настоятельно рекомендуется не использовать "?" в качестве замены чар. Просто установите выходную кодировку в 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!!")
1 голос
/ 11 августа 2011

Вы можете получить текущую кодировку STDOUT следующим образом:

>>> import sys
>>> sys.stdout.encoding
UTF-8

Затем кодируйте свою строку Unicode соответствующим образом:

>>> u"Ä"
u'\xc4'
>>> sys.stdout.write(u"Ä".encode(enc, 'replace'))

'replace' избегаетUnicodeEncodeErrors, когда символ не представлен в кодировке терминала.Затем он будет заменен знаком вопроса.

0 голосов
/ 11 апреля 2015

Кодировка ввода текста (здесь utf-8) не имеет значения. Вы должны преобразовать utf8-bytestring в Unicode как можно скорее, чтобы напечатать текст:

print(unicode_text)
  • не кодировать текст в utf8 перед печатью
  • не изменяйте sys.stdout для кодирования текста, используя для вас utf8

Выходная кодировка определяется средой, в которой выполняется ваш сценарий, на основе настроек локали (LANG, LC_CTYPE, LC_ALL) или PYTHONIOENCODING envvar. Не выводите utf8 безоговорочно.

Например, если локаль не установлена; Вы можете указать это явно:

$ LANG=en_US.utf8 python your_script.py

Убедитесь, что ваш терминал способен отображать соответствующие символы Unicode (установлены шрифты, соответствующие локали (locale -a)).

Другими словами, чтобы исправить вывод, исправьте среду, например, настройте свои языковые настройки для использования C.UTF-8 по умолчанию .

...