Путаница в кодировании Python - PullRequest
1 голос
/ 25 мая 2010

Я получил данные, закодированные в big5, из базы данных, и я хочу отправить данные как электронное письмо с HTML-контентом, код выглядит так:

html += """<tr><td>"""        
html += unicode(rs[0], 'big5') # rs[0] is data encoded in big5

Я запускаю скрипт, но возникла ошибка: UnicodeDecodeError: кодек «ascii» не может декодировать байт ...... Однако я пробовал код в командной строке интерактивного python, ошибок не возникло, не могли бы вы дай мне подсказку?

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

Если html уже не является объектом Unicode, а является обычной строкой, он преобразуется в Unicode при объединении с преобразованной версией rs[0]. Если html теперь содержит специальные символы, вы можете получить ошибку Unicode.

Таким образом, другое содержимое html также должно быть правильно декодировано в Unicode. Если специальные символы взяты из строковых литералов, вы можете использовать вместо них литералы Юникода (например, u"abcä").

1 голос
/ 25 мая 2010

Ваш звонок на unicode() работает правильно. Именно конкатенация, которая добавляет объект Unicode к байтовой строке, вызывает проблемы. Если вы измените первую строку на u'''<tr><td>''', (или u'<tr><td>'), она должна работать нормально.

Изменить: это означает, что ваша ошибка заключается в данных, которые уже находятся в html к тому времени, когда питон достигает этого фрагмента:

>>> '\x9f<tr><td>' + unicode('\xc3\x60', 'big5')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x9f in position 0: ordinal not in range(128)
>>> u'\x9f<tr><td>' + unicode('\xc3\x60', 'big5')
u'\x9f<tr><td>\u56a5'
>>> 
...