2013-02-11 3 views
1

У меня есть словарь с несколькими символами Юникода, а используемая консоль настроена на печать UTF-8, но когда я пытаюсь распечатать ключ из словаря, я получаю сообщение об ошибке.Почему мои символы Юникода из моего словаря не печатаются?

import sys 
print u'\xc9' 
print sys.stdout.encoding 

unicode_dict = {u'a': 3, 
       u'b': 4, 
       u'c': 5, 
       u'\xc9': 1, 
       u'\xc8': 2} 

for k, v in unicode_dict.iteritems(): 
    print "{0}: {1}".format(k, v) 

Когда я запускаю этот код, я получаю следующее сообщение об ошибке:

É 
UTF-8 
a: 3 
Traceback (most recent call last): 
    File "unicodetest.py", line 12, in <module> 
    print "{0}: {1}".format(k, v) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc9' in position 0: ordinal not in range(128) 

Что здесь происходит? Почему печать дает мне эту ошибку?

ответ

3

Эта линия:

print "{0}: {1}".format(k, v) 

означает, что вы пытаетесь преобразовать строку в ASCII, как показывает ошибки. Не надо этого делать: либо сохранить его в кодировке Unicode, и получить выход, чтобы преобразовать его в случае необходимости:

print u"{0}: {1}".format(k, v) 

или преобразовать его в явном виде, используя то, что поддерживает эти символы, вероятно, UTF-8:

print "{0}: {1}".format(k.encode('utf-8'), v) 
+0

Спасибо! По какой-то причине я думал, что, поскольку в функции формата есть символы Unicode, форматированная строка будет автоматически закодирована в Unicode. – supercheetah

1

Если вы импортируете unicode_literals из будущего модуля, он должен вести себя так, как вы этого хотите. Просто добавьте

from __future__ import unicode_literals 

как самая верхняя строка в вашем файле. Тогда код, который вы указали, будет вести себя как Daniel Roseman's:

print u"{0}: {1}".format(k, v) 
Смежные вопросы