2015-05-22 3 views
0

Я использую этот пакет здесь: HTML.py 0.04Кодирование Юникода и не юникод символов в HTML

Вот что я делаю:

import html 
h = html.HTML() 
h.p('Some simple Euro: €1.14') 
h.p(u'Some Euro: €1.14') 

Теперь, когда я >>> unicode(h) я получаю сообщение об ошибке.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 18: ordinal not in range(128)

Каков наилучший способ справиться с этим? Мне нужно написать html в файл.

+1

В Py2, в лучшем случае, старайтесь всегда использовать строки юникода ('u'''), вы можете использовать' from __future__ import unicode_literals' в верхней части файла для автоматического преобразования большинства '' '' 'в' u '' 'автоматически. Лично я мог бы избежать Py2, если это возможно, это беспорядок в кодировании (делая много конверсии в вашей спине) и может быть очень запутанным. – JeromeJ

ответ

1
h.p('Some simple Euro: €1.14') 

Вы должны избегать байтовых строк ('' в Python 2, b'' в Python 3) для контента HTML. Модель символов HTML - это Unicode, поэтому следует использовать только строки Unicode (u'').

Вы можете избежать неправильного использования для простых символов ASCII. Поскольку большинство распространенных байтовых кодировок являются надмножествами ASCII, Python 2 будет неявно преобразовывать байтовые строки ASCII в Unicode. Но символ не является частью ASCII, поэтому Python не может сказать, как его читать. Если вы сохранили исходный код выше, используя кодировку UTF-8, тогда у вас есть строка байтов b'\xe2\x82\xac', которая может означать , €, 竄ャ или многие другие последовательности символов в зависимости от того, какая кодировка используется.