Как отобразить неанглийские символы в Python? - PullRequest
3 голосов
/ 27 ноября 2011

У меня есть словарь Python, который содержит элементы, которые не являются английскими символами.Когда я печатаю словарь, оболочка python неправильно отображает неанглийские символы.Как я могу это исправить?

Ответы [ 4 ]

6 голосов
/ 28 ноября 2011

Когда ваше приложение печатает hei\xdfen вместо heißen, это означает, что вы фактически не печатаете фактическую строку в кодировке Unicode, а вместо этого в строковом представлении объекта Unicode.

Допустим, ваша строка ("heißen") хранится в переменной с именем text. Просто чтобы убедиться, где вы находитесь, проверьте тип этой переменной, вызвав:

>>> type(text)

Если вы получаете <type 'unicode'>, это означает, что вы имеете дело не со строкой, а с unicode объектом.

Если вы сделаете интуитивно понятную вещь и попытаетесь напечатать текст, введя print(text), вы не получите фактический текст ("heißen"), а вместо этого строковое представление объекта Unicode .

Чтобы это исправить, вам нужно знать, какая кодировка имеется в вашем терминале, и распечатать объект Unicode, закодированный в соответствии с заданной кодировкой .

Например, если ваш терминал использует кодировку UTF-8, вы можете распечатать строку, вызвав:

text.encode('utf-8')

Это для основных понятий. Теперь позвольте мне привести более подробный пример. Предположим, у нас есть файл исходного кода, в котором хранится ваш словарь. Как:

mydict = {'heiße': 'heiße', 'äää': 'ööö'}

Когда вы наберете print mydict, вы получите {'\xc3\xa4\xc3\xa4\xc3\xa4': '\xc3\xb6\xc3\xb6\xc3\xb6', 'hei\xc3\x9fe': 'hei\xc3\x9fe'}. Даже print mydict['äää'] не работает: в результате получается что-то вроде ├Â├Â├Â. Природа проблемы раскрывается при попытке print type(mydict['äää']), который скажет вам, что вы имеете дело с string объектом.

Чтобы решить эту проблему, вам сначала необходимо декодировать строковое представление из кодировки вашего исходного кода в unicode-объект, а затем представить его в кодировке вашего терминала. Для отдельных предметов в диктанте это может быть достигнуто:

print unicode(mydict, 'utf-8')

Обратите внимание, что если кодировка по умолчанию не применяется к вашему терминалу, вам нужно написать:

print unicode(mydict, 'utf-8').encode('utf-8')

Где метод внешнего кодирования определяет кодировку в соответствии с вашим терминалом.

Я действительно настоятельно призываю вас прочитать «1044 *» Джоэла «Абсолютный минимум, который должен знать каждый разработчик программного обеспечения о юникоде и наборах символов (никаких оправданий!)» . Если вы не понимаете, как работают наборы символов, вы будете сталкиваться с проблемами, подобными этому, снова и снова.

1 голос
/ 25 ноября 2013

В терминале Python,

    >>> "heißen"
    is equivalent to
    >>> print repr("heißen")

Документация Python по repr в python 2 http://docs.python.org/2/library/functions.html#func-repr скудно.

Как видно, оба дают вам «байтовое» представление строки байтов «heißen», где все байты, которые больше 127, кодируются \ x. Вот откуда вы получаете

    'hei\xc3\x9fen'

Юникод repr () не намного полезнее. Он корректно отображает 'ß' как отдельного чека без кода '\ xdf', но все еще не читается.

Практическое решение, которое я нашел, - это использование Python 3.

http://docs.python.org/3/library/functions.html#repr

на странице также написано

    ascii(object)
    As repr(), return a string containing a printable representation of an
    object, but escape the non-ASCII characters in the string returned by
    repr() using \x, \u or \U escapes. This generates a string similar to
    that returned by repr() in Python 2.

, что немного объясняет вещи.

1 голос
/ 28 ноября 2011

В Python 3.0 есть строки по умолчанию в Юникоде, а в Python 2.x вы должны ставить префикс строки с

u"汉字/漢字 chinese"  
1 голос
/ 28 ноября 2011

На самом деле, это не совсем проблема, связанная с Python.

В ваших переменных среды (я предполагаю, что вы используете Linux или Mac) должна быть активна кодировка символов UTF-8.

Вы должны иметь возможность поместить их в файл ~ / .profile (или ~ / .bashrc):

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

-edit-

На самом деле, Mac использует UTF-8 по умолчанию. Это проблема Windows / Linux.

-дит 2-

Разумеется, вы всегда должны использовать строки Unicode, редактор Unicode и Doctype Unicode. Но я предполагаю, что вы знаете, что: -)

...