2009-08-31 1 views
1

У меня есть проблема читает текстовый файл для вставки в БД таблицы MySQL, të съязвил этого кода:латинские буквы с острым: DjangoUnicodeDecodeError

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

archivo = open('file.txt',"r")
for line in archivo.readlines():
....body = body + line
model = MyModel(body=body)
model.save()

я получаю DjangoUnicodeDecodeError: кодек

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

Строка, которая не может быть закодирована/расшифрована, была: araci n.

Я попытался body.decode ('UTF-8'), body.decode ('Latin-1'), body.decode ('ISO-8859-1') без решения.

Вы можете мне помочь? Любой намек оценивается :)

ответ

5

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

+0

Спасибо Алекс, отвечая на ваш вопрос, здесь:> manage.py обстреливать Python 2.5.4 (InteractiveConsole) >>> а = 'A' >>> '\ xa0' >>> а. decode ('iso-8859-1'). encode ('utf-8') '\ xc2 \ xa0' >>> test = unicode (a) Traceback (последний последний звонок): Файл "" , строка 1, в UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xa0 в позиции 0: порядковый номер не в диапазоне (128) – panchicore

+0

В 'test = unicode (a)' вы неявно используете ascii-кодек, так как сообщение об ошибке так ясно говорит вам, поэтому, конечно, это не удается. Используйте 'unicode (a, 'iso-8859-1')', если вы знаете, что закодировано в ISO-8859-1. Если вы назначили результаты последовательности кодирования/декодирования другой переменной, скажем, b, 'unicode (b, 'utf-8')' будет работать. Etc и т. Д. Возможно, вы просто вызываете кодировку и декодируете этот путь, а затем и НЕ назначаете, а затем используете их результаты ...?! Помните, что строки неизменяемы, поэтому вызовы методов не изменяют их: они возвращают РЕЗУЛЬТАТЫ (назначают их и используют их!). –