django + постоянные ошибки юникода - PullRequest
2 голосов
/ 27 марта 2012

В прошлом году я создал сайт django, в котором для клиента используются как панель мониторинга, так и API.

Иногда они представляют информацию в кодировке Unicode (обычно через клавиатуру Microsoft и символ одинарной кавычки!)в базу данных.

Хорошо изменить этот экземпляр для всего, но я постоянно получаю что-то вроде этой ошибки, когда добавляется новый персонаж, которого я не "конвертировал":

UnicodeDecodeError at /xx/xxxxx/api/xxx.json

кодек 'ascii' не может декодировать байт 0xeb в позиции 0: порядковый номер не в диапазоне (128)

Проблемана самом деле мне нужно иметь возможность конвертировать этот юникод (из модели) в HTML.

# if a char breaks the system, replace it here (duplicate line)
text = unicode(str(text).replace('\xa3', '£'))

Я дублирую эту строку здесь, но в противном случае она просто ломается.

Срывая волосыиз-за того, что я знаю , это прямо, и я где-то делаю что-то удивительно глупое.

Искал в другом месте и понял, что, хотя моя проблема не нова, я не могу найти ответв другом месте.

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Сообщите JSON-декодеру, что он должен декодировать JSON-файл как Unicode.При непосредственном использовании модуля json это можно сделать с помощью следующего кода:

json.JSONDecoder(encoding='utf8').decode(
    json.JSONEncoder(encoding='utf8').encode('blä'))

Если декодирование JSON происходит с помощью некоторых других модулей (django, ...), возможно, вы можете передать информацию черезэтот другой модуль в JSON материал.

0 голосов
/ 27 марта 2012

Я предполагаю, что text - это Unicode (что кажется безопасным предположением, поскольку \xa3 - это Unicode для символа £).

Я не уверен, зачем вам вообще его кодировать, так как текст будет преобразован в utf-8 при выводе в шаблоне, и все браузеры способны отображать это. Вероятно, есть еще один момент, когда что-то (вероятно, ваш код, к сожалению) предполагает ASCII, а неявное преобразование разрушает вещи.

В этом случае, вы можете просто сделать это:

text = text.encode('ascii', 'xmlcharrefreplace')

, который преобразует символы, не входящие в ASCII, в объекты HTML / XML, такие как £.

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