Латинские буквы с острием: DjangoUnicodeDecodeError

У меня проблема с чтением txt-файла для вставки в таблицу базы данных mysql, т. е. вырезанный из этого кода:

файл содержит в первой строке: "aclaración"

archivo = open('file.txt',"r")
для строки в archivo.readlines():
....body = body + line
model = MyModel(body=body)< br> model.save()

я получаю DjangoUnicodeDecodeError:

Кодек utf8 не может декодировать байты в позиции 8: неверные данные. Вы передали в 'aclaraci\xf3n' (введите 'str') подсказку об ошибке Unicode

Не удалось закодировать/декодировать строку: araci�n.

Я пробовал body.decode('utf-8'), body.decode('latin-1'), body.decode('iso-8859-1') без решения.

Не могли бы вы мне помочь? Любая подсказка приветствуется :)


person panchicore    schedule 31.08.2009    source источник


Ответы (1)


Судя по коду \xf3 для 'ó', похоже, что данные закодированы в ISO-8859-1 (или близком родственнике). Таким образом, body.decode('iso-8859-1') должна быть допустимой строкой Unicode (вы не указываете, что означает «без решения» - какое сообщение об ошибке вы получаете и где?); если вместо этого вам нужна строка байтов в кодировке utf-8, body.decode('iso-8859-1').encode('utf-8') должна дать вам ее!

person Alex Martelli    schedule 31.08.2009
comment
Спасибо Алекс, отвечая на ваш вопрос, вот: ›manage.py shell Python 2.5.4 (InteractiveConsole) ››› a = 'á' ››› a '\xa0' ››› a.decode('iso-8859-1 ').encode('utf-8') '\xc2\xa0' ››› test = unicode(a) Traceback (последний последний вызов): файл ‹console›, строка 1, в ‹module› UnicodeDecodeError: 'ascii ' кодек не может декодировать байт 0xa0 в позиции 0: порядковый номер не в диапазоне (128) - person panchicore; 31.08.2009
comment
В test=unicode(a) вы неявно используете кодек ascii, как ясно говорит вам сообщение об ошибке, поэтому, конечно, это не удается. Используйте unicode(a,'iso-8859-1'), если вы знаете, что a закодирован в ISO-8859-1. Если вы присвоите результаты последовательности кодирования/декодирования другой переменной, скажем, b, тогда будет работать unicode(b, 'utf-8'). И т. д. и т. д. Может быть, вы просто вызываете кодирование и декодирование так и сяк, а НЕ назначаете, а затем используете их результаты...?! Помните, что строки неизменяемы, поэтому вызовы методов не ИЗМЕНЯЮТ их: они возвращают РЕЗУЛЬТАТЫ (назначьте их и используйте!-). - person Alex Martelli; 31.08.2009