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
  • Как сделать surrogateescape в python2
  • Отображение UTF8 stings в терминале Ubuntu с помощью скрипта Python
  • Не пытайтесь прочитать unicode из командной строки?
  • python 2.7 нижний регистр
  • Идентификатор имени ISO 8859-1 не декодируется
  • Как сделать форматирование строк с помощью unicode emdash?
  • MIMEText UTF-8 кодирует проблемы при отправке электронной почты
  • Python печатает строки unicode в массивах как символы, а не кодовые точки
  • Преобразование кодировки unicode в UTF8 hex в python
  • Что такое внутреннее представление строки в Python 3.x
  •  
    Interesting Posts for Van-Lav

    Вызов метода python из C / C ++ и извлечение его возвращаемого значения

    Как создать кортеж кортежей в python?

    В чем разница между аргументом буферизации open () и жестко запрограммированным размером буфера для чтения, используемым при итерации через файл?

    Scapy sniff () в классе, что подклассы threading.Thread ()

    Преобразование значений ConfigParser в типы данных python

    Создание анимированного GIF в Python

    Python – Тестирование абстрактного базового класса

    Встроенные имена / атрибуты магической переменной

    Возможно ли исключить тестовые каталоги из отчетов coverage.py?

    Неожиданное относительное поведение импорта в Python

    Найдите процент подобия между двумя строками

    Matplotlib: та же высота для colorbar, что и для сюжета

    Преобразование Python * args to list

    Хэш-алгоритм для динамического роста / потоковой передачи данных?

    Почему операция печати в обработчике сигнала может изменить ситуацию взаимоблокировки?

    Python - лучший язык программирования в мире.