Ошибка декодирования Python ASCII и Unicode
У меня возникла такая очень неприятная ошибка при вставке определенной строки в мою базу данных. Он сказал что-то вроде:
Python не может декодировать байтовые символы, ожидая unicode "
После большого поиска я увидел, что могу преодолеть эту ошибку, закодировав мою строку в Unicode. Я пытаюсь сделать это, сначала расшифровав строку, а затем закодирую ее в формате UTF-8. Как:
string = string.encode("utf8")
И я получаю следующую ошибку:
'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)
Я умираю от этой ошибки! Как это исправить?
Ответы
Ответ 1
EDIT: Как вы можете видеть из downvotes, это НЕ лучший способ сделать это. Отличный и очень рекомендуемый ответ сразу после этого, поэтому, если вы ищете хорошее решение, воспользуйтесь этим. Это хакерское решение, которое не будет любезным для вас в более поздний момент времени.
Я чувствую вашу боль, у меня было много проблем с той же ошибкой. Самый простой способ я решил (и это может быть не самый лучший способ, и это зависит от вашего приложения) заключалось в том, чтобы конвертировать вещи в unicode и игнорировать ошибки. Здесь приведен пример из Документация Unicode HOWTO - Python v2.7.3
>>> unicode('\x80abc', errors='strict')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
ordinal not in range(128)
>>> unicode('\x80abc', errors='replace')
u'\ufffdabc'
>>> unicode('\x80abc', errors='ignore')
u'abc'
Хотя это может быть не самый подходящий метод, это метод, который сработал у меня.
EDIT:
Несколько человек в комментариях упомянули, что это плохая идея, хотя ответчик принял ответ. Это НЕ отличная идея, это повредит, если вы имеете дело с европейскими и акцентированными персонажами. Тем не менее, это то, что вы можете использовать, если это НЕ код уровня продукции, если это персональный проект, над которым вы работаете, и вам нужно быстро исправить ситуацию. В конце концов вам нужно будет исправить это с помощью правильных методов, о которых говорится в ответах ниже.
Ответ 2
Вам нужно принять дисциплинированный подход. Прагматичный Юникод, или Как остановить Боль? имеет все, что вам нужно.
Если вы получите эту ошибку в этой строке кода, проблема в том, что string
является байтовой строкой, а Python 2 неявно пытается ее декодировать в Unicode для вас. Но это не чистый ascii. Вам нужно знать, что такое кодировка, и правильно декодировать ее.
Ответ 3
Метод encode
должен использоваться для объектов unicode
для преобразования их в объект str
с заданным кодированием. Метод decode
должен использоваться в str
объектах данной кодировки для преобразования их объектов unicode
.
Я полагаю, что ваши базы данных хранят строки в UTF-8. Поэтому, когда вы получаете строки из базы данных, преобразуйте их в объекты unicode
, выполнив str.decode('utf-8')
. Затем используйте только unicode
объекты в вашей программе python (литералы определяются с помощью u'unicode string'
). И перед тем, как сохранить их в своей базе данных, преобразуйте их в объекты str
с помощью uni.encode('utf-8')
.
Ответ 4
Кодовая точка 0xE3 является символом 'a' с тильдой в Unicode. Ваша исходная строка, скорее всего, уже есть в UTF-8, поэтому вы не можете ее декодировать, используя набор символов ASCII по умолчанию.