Python – кодек ascii не может декодировать байт

Я действительно смущен. Я попытался кодировать, но ошибка сказала, что can't decode...

 >>> "你好".encode("utf8") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 

Я знаю, как избежать ошибки с префиксом «u» в строке. Мне просто интересно, почему ошибка «не может декодироваться» при вызове encode. Что делает Python под капотом?

6 Solutions collect form web for “Python – кодек ascii не может декодировать байт”

 "你好".encode('utf-8') 

encode преобразует объект unicode в string объект. Но здесь вы вызывали его на string объект (потому что у вас нет u). Таким образом, python должен сначала преобразовать string в объект unicode . Таким образом, это эквивалентно

 "你好".decode().encode('utf-8') 

Но декодирование выходит из строя, потому что строка недействительна ascii. Вот почему вы получаете жалобу о невозможности декодирования.

Всегда кодировать из юникода в байты.
В этом направлении вы можете выбрать кодировку .

 >>> u"你好".encode("utf8") '\xe4\xbd\xa0\xe5\xa5\xbd' >>> print _你好 

Другой способ – декодировать от байтов до unicode.
В этом направлении вы должны знать, что такое кодировка .

 >>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd' >>> print bytes你好>>> bytes.decode('utf-8') u'\u4f60\u597d' >>> print _你好 

Эта точка не может быть подчеркнута достаточно. Если вы хотите избежать воспроизведения unicode «whack-a-mole», важно понять, что происходит на уровне данных. Здесь объясняется еще один способ:

  • Объект unicode уже декодирован, вы никогда не хотите вызывать decode на нем.
  • Объект bytestring уже закодирован, вы никогда не хотите называть его encode .

Теперь, увидев .encode в байтовой строке, Python 2 сначала пытается неявно преобразовать его в текст (объект unicode ). Аналогично, при просмотре .decode в строке unicode, Python 2 неявно пытается преобразовать его в байты (объект str ).

Эти неявные преобразования – вот почему вы можете получить Unicode Decode Error при вызове encode . Это потому, что кодировка обычно принимает параметр типа unicode ; при приеме параметра str существует неявное декодирование в объект типа unicode перед повторным кодированием его с другой кодировкой. Это преобразование выбирает дешифратор 'ascii' по умолчанию, что дает вам ошибку декодирования внутри кодера.

На самом деле, в Python 3 методы str.decode и bytes.encode даже не существуют. Их устранение было [противоречивой] попыткой избежать этой общей путаницы.

… или независимо от кодирования sys.getdefaultencoding() упоминает; обычно это "ascii"

Вы можете попробовать это

 import sys reload(sys) sys.setdefaultencoding("utf-8") 

Или

Вы также можете попробовать следующее

Добавьте следующую строку вверху вашего .py-файла.

 # -*- coding: utf-8 -*- 

Если вы используете Python <3, вам нужно сообщить интерпретатору, что ваш строковый литерал является Unicode, предварительно используя его :

 Python 2.7.2 (default, Jan 14 2012, 23:14:09) [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> "你好".encode("utf8") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) >>> u"你好".encode("utf8") '\xe4\xbd\xa0\xe5\xa5\xbd' 

Дальнейшее чтение : Unicode HOWTO .

Вы используете u"你好".encode('utf8') для кодирования строки в u"你好".encode('utf8') . Но если вы хотите представить "你好" , вы должны его декодировать. Как:

 "你好".decode("utf8") 

Вы получите то, что хотите. Возможно, вам стоит больше узнать о кодировании и декодировании.

Если вы имеете дело с Unicode, иногда вместо encode('utf-8') , вы также можете попытаться игнорировать специальные символы, например

 "你好".encode('ascii','ignore') 

или как something.decode('unicode_escape').encode('ascii','ignore') как предлагается здесь .

Не особенно полезно в этом примере, но может работать лучше в других сценариях, когда невозможно преобразовать некоторые специальные символы.

В качестве альтернативы вы можете рассмотреть возможность замены конкретного символа с помощью функции replace() .

  • Торнадо и Юникод
  • Имена файлов Python os.stat и unicode
  • Как использовать шаблон контента типа Django и UTF-8 для шаблона?
  • Почему я получаю ошибку «TypeError: принуждение к Unicode: нужна строка или буфер, int found»?
  • как декодировать строку ascii с кодами обратной косой черты x \ x
  • преобразование строки unicode в python
  • UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xa0' в позиции 20: порядковый номер не в диапазоне (128)
  • Тип и формат sys.exc_info () в Python 2.71
  • Python - лучший язык программирования в мире.