Ошибка печати Unicode Python 2.6? - PullRequest
       17

Ошибка печати Unicode Python 2.6?

0 голосов
/ 25 января 2012

Вот три фрагмента схожего кода, первые два работают нормально, последний выходит из строя -

    # 1
    print '%d) "%s" ' % (new_item_count, item[u'Title'].encode('utf-8')),
    print '%s' % item[u'CurrencyID'],
    print '%s !' % item[u'Value']

    # 2
    print '%d) "%s" %s%s !!' % (new_item_count,
            item[u'Title'].encode('utf-8'),
            item[u'CurrencyID'].encode('utf-8'),
            item[u'Value'])

    # 3
    print '%d) "%s" %s%s !!!' % (new_item_count,
            item[u'Title'].encode('utf-8'),
            item[u'CurrencyID'],
            item[u'Value'])

Вывод (обратите внимание на отличительные восклицательные знаки в конце) -

37) "HP Pavilion Laptop / Intel® Core™ i3 Processor"  USD 510.0 !
37) "HP Pavilion Laptop / Intel® Core™ i3 Processor" USD510.0 !!
'ascii' codec can't decode byte 0xc2 in position 29: ordinal not in range(128)

Это в Python 2.6.5 (пакет Ubuntu 10.04, одинаковое поведение как в 32-битной, так и в 64-битной версиях) -

$ python -V
Python 2.6.5
$ uname -a
Linux <> 2.6.39.1-x86_64-<> #1 SMP Tue Jun 21 10:04:20 EDT 2011 x86_64 GNU/Linux

Единственное объяснение, которое я могу придумать, - это ошибка Python.

Или это?

1 Ответ

4 голосов
/ 25 января 2012

Возможно, вы даже вызвали некоторую несостоятельность, но ваш код - во всех примерах. немного грязно.

Вы не должны смешивать Unicode и не-Unicode строки, подобные этому

Пожалуйста, взгляните на http://www.joelonsoftware.com/articles/Unicode.html - статья дает хорошее представление о том, что на самом деле представляет собой юникод и различные кодировки, и значительно упрощает последующее кодирование.

Что касается вашего конкретного фрагмента, если все ваши данные в словаре "item" находятся в надлежащем формате в Юникоде, как он видит, просто выполните интерполяцию строки в Unicode и просто закодируйте окончательную результирующую строку в предполагаемый формат вывода:

message = u'%d) "%s" %s%s !!!' % (new_item_count,
            item[u'Title'],
            item[u'CurrencyID'],
            item[u'Value']))
print message.encode("utf-8")
...