Отображение строк UTF8 в терминале Ubuntu с помощью скрипта Python

1

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

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

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

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

  • 0
    Вы уверены, что ваши региональные настройки соответствуют тому, что на самом деле делает терминал?
  • 0
    Никогда не полагайтесь на настройки терминала. Установите все кодирование UTF-8 и удалите все эти heisenbugs.
Теги:
terminal
character-encoding
unicode
utf-8

3 ответа

2
Лучший ответ

Настоятельно рекомендуется, чтобы вы не использовали "?" в качестве замены. Просто установите кодировку вывода в 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!!")
  • 0
    Благодарю. В редактировании я использовал: 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) Были зависимости импорта, которые я не смог найти, чтобы получить ваш первый бит кода работает.
1

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

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

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

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

"Replace " позволяет избежать UnicodeEncodeErrors, когда символ не отображается в терминальной кодировке. Затем он будет заменен вопросительным знаком.

0

Входная кодировка текста (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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню