Python - кодек 'ascii' не может декодировать байт - PullRequest
38 голосов
/ 18 февраля 2011

Я использую Python 2.6 и Jinja2 для создания отчетов в формате HTML. Я предоставляю шаблону много результатов, и шаблон проходит через них и создает таблицы HTML

При вызове template.render у меня неожиданно появилась эта ошибка.

<td>{{result.result_str}}</td>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

Странно то, что даже если для каждого результата я устанавливаю result.result_str в простую строку ascii, например, "abc", я все еще вижу эту ошибку. Я новичок в Jinja2 и Python и буду признателен за любые идеи о том, как я могу исследовать проблему, чтобы найти причину.

Ответы [ 7 ]

77 голосов
/ 17 февраля 2013

Попробуйте добавить это:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Это исправило мою проблему, удачи.

41 голосов
/ 18 февраля 2011

С http://jinja.pocoo.org/docs/api/#unicode

Jinja2 использует Юникод для внутреннего использования, что означает, что вам необходимо передавать объекты Юникода в функцию рендеринга или строки байтов, которые состоят только из символов ASCII.

Так что, где бы вы ни указали result.result_str, вам нужно сделать его в юникоде, например,

result.result_str = unicode(my_string_variable, "utf8")

(Если ваши байты были в кодировке utf8 в кодировке Unicode)

или

result.result_str = u"my string"
20 голосов
/ 18 февраля 2011

Если вы получили ошибку со строкой типа «ABC», возможно, не-ASCII символ находится где-то еще.Возможно, в источнике шаблона?

В любом случае, используйте строки Unicode во всем приложении, чтобы избежать подобных проблем.Если ваш источник данных предоставляет вам байтовые строки, вы получите строки в юникоде с byte_string.decode('utf-8'), если строка закодирована в UTF-8.Если ваш источник - файл, используйте класс StreamReader в модуле кодеков.

Если вы не уверены в разнице между строками Unicode и обычными строками, прочитайте это: http://www.joelonsoftware.com/articles/Unicode.html

9 голосов
/ 25 сентября 2014

Только что столкнулся с той же проблемой в фрагменте кода, который сохраняет вывод из Jinja2 в файлы HTML:

with open(path, 'wb') as fh:
    fh.write(template.render(...))

Легко обвинять Jinja2, хотя настоящая проблема в open() Python, который с версии 2.7 не поддерживает UTF-8. Исправление так же просто, как:

import codecs
with codecs.open(path, 'wb', 'utf-8') as fh:
    fh.write(template.render(...))
4 голосов
/ 17 апреля 2011

Простые строки могут содержать байты символов UTF-8, но они не относятся к типу Unicode. Это можно исправить с помощью «decode», который преобразует str в unicode. Работает в Python 2.5.5.

my_string_variable.decode ( "utf8")

0 голосов
/ 20 февраля 2013

Или вы можете сделать

export LANG='en_US.UTF-8'

в консоли, где вы запускаете скрипт.

0 голосов
/ 18 февраля 2011

ASCII - это 7-битный код. Значение 0xC4 не может быть сохранено в 7 битах. Поэтому вы используете неправильную кодировку для этих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...