Декодирование, не меняющее кодировку Unicode в Django / Python - PullRequest
2 голосов
/ 13 апреля 2010

Хорошо, у меня есть жестко закодированная строка, которую я объявляю вот так

name = u"Par Catégorie"

У меня есть # - - кодировка: utf-8 - - магический заголовок, поэтому я предполагаю, что он преобразован в utf-8

В дальнейшем он выводится в xml через

xml_output.toprettyxml(indent='....', encoding='utf-8')

И я получаю

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

Большая часть моих данных на французском языке и правильно выводится в узлах CDATA, но эта одна запрограммированная строка хранится ... Я не понимаю, почему вызывается кодек ascii.

что не так?

Ответы [ 2 ]

4 голосов
/ 13 апреля 2010

Заголовок coding в вашем исходном файле сообщает Python, в какой кодировке находится ваш исходный код . Это кодировка, которую Python использует для декодирования источника строкового литерала Unicode (u"Par Catégorie") в объект Unicode , Сам объект Unicode не имеет кодировки; это необработанные данные Unicode. (Внутренне, Python будет использовать одну из двух кодировок, в зависимости от того, как он был настроен, но код Python не должен беспокоиться об этом.)

UnicodeDecodeError, которое вы получаете, означает, что где-то вы смешиваете строки юникода и строки байтов (обычные строки). При их смешивании (конкатенация, интерполяция строк и т. Д.) Python попытается преобразовать строку байтов в строку юникода путем декодирования строка байтов, использующая кодировку по умолчанию, ASCII. Если строка содержит не-ASCII-данные, произойдет сбой с появившейся ошибкой. Выполняемая операция может быть где-то в библиотеке, но это все равно означает, что вы смешиваете входы разных типов.

К сожалению, тот факт, что он будет работать нормально, пока строки байтов содержат только данные ASCII, означает, что этот тип ошибок слишком часто встречается даже в коде библиотеки. Python 3.x решает эту проблему, избавляясь от неявного преобразования между строками юникода (просто str в 3.x) и строками байтов (тип bytes в 3.x.)

1 голос
/ 13 апреля 2010

Неправильное имя параметра? Начиная с документа , я вижу, что имя аргумента ключевого слова должно быть encoding, а не coding.

...