Когда ваше приложение печатает 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 *» Джоэла «Абсолютный минимум, который должен знать каждый разработчик программного обеспечения о юникоде и наборах символов (никаких оправданий!)» . Если вы не понимаете, как работают наборы символов, вы будете сталкиваться с проблемами, подобными этому, снова и снова.