Подтвердить что ты не робот

Python - кодек ascii не может декодировать байт

Я использую 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 и буду благодарен за любые идеи о том, как я могу разобраться с проблемой, чтобы добраться до основной причины.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

От http://jinja.pocoo.org/docs/api/#unicode

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

Поэтому везде, где вы устанавливаете result.result_str, вам нужно сделать его unicode, например.

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

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

или

result.result_str = u"my string"

Ответ 4

Просто столкнулся с той же проблемой в куске кода, который сохраняет выходной файл Jinja2 в HTML файлы:

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

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

import codecs
with codecs.open(path, 'wb', 'utf-8') as fh:
    fh.write(template.render(...))

Ответ 5

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

my_string_variable.decode( "UTF-8" )

Ответ 6

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

Ответ 7

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

export LANG='en_US.UTF-8'

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