Я действительно смущен. Я пытался кодировать но ошибка сказала 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 под капотом?
"你好".decode('utf-8').encode('utf-8')
Всегда кодируйте из юникода в байты.
В этом направлении вы можете выбрать кодировку .
Другой способ - декодировать байты в юникод.
В этом направлении вы должны знать, что такое кодировка .
Этот момент нельзя переоценить. Если вы не хотите играть в юникод "бей крота", важно понимать, что происходит на уровне данных. Здесь это объясняется по-другому:
decode
.encode
.Теперь, увидев
.encode
байтовую строку, Python 2 сначала пытается неявно преобразовать ее в текст (unicode
объект). Точно так же, увидев.decode
строку юникода, Python 2 неявно пытается преобразовать ее в байты (str
объект).Эти неявные преобразования - вот почему вы можете получить, когда позвонили . Это потому, что кодирование обычно принимает параметр типа ; при получении параметра происходит неявное декодирование в объект типа перед его повторным кодированием в другой кодировке. Это преобразование выбирает декодер ascii по умолчанию † , что дает вам ошибку декодирования внутри кодировщика.
Unicode
Decode
Error
encode
unicode
str
unicode
Фактически, в Python 3 методов
str.decode
иbytes.encode
вовсе не существует. Их удаление было [противоречивый] попытки избежать этой общей путаницы.† ... или как там написано в коде
sys.getdefaultencoding()
; обычно это asciiисточник
_
относится к предыдущему значению 2. потому что это вопрос python-2.x.Вы можете попробовать это
Или
Вы также можете попробовать следующее
Добавьте следующую строку вверху вашего .py файла.
источник
Если вы используете Python <3, вам нужно сообщить интерпретатору, что ваш строковый литерал является Unicode, добавив к нему префикс
u
:Дополнительная литература : Unicode HOWTO .
источник
Вы используете
u"你好".encode('utf8')
для кодирования строки в Юникоде. Но если вы хотите изобразить"你好"
, вы должны это расшифровать. Как:Вы получите то, что хотите. Возможно, вам стоит узнать больше о кодировании и декодировании.
источник
Если вы имеете дело с Unicode, иногда вместо этого
encode('utf-8')
вы также можете попытаться игнорировать специальные символы, напримерили как
something.decode('unicode_escape').encode('ascii','ignore')
предложено здесь .Не особенно полезно в этом примере, но может работать лучше в других сценариях, когда невозможно преобразовать некоторые специальные символы.
В качестве альтернативы вы можете рассмотреть возможность замены определенного символа, используя
replace()
.источник
Если вы запускаете интерпретатор python из оболочки в Linux или аналогичных системах (BSD, не уверен в Mac), вам также следует проверить кодировку по умолчанию для оболочки.
Вызовите
locale charmap
из оболочки (не интерпретатора Python), и вы должны увидетьЕсли это не так, и вы видите что-то еще, например
Python будет (по крайней мере, в некоторых случаях, таких как мой) унаследовать кодировку оболочки и не сможет печатать (некоторые? Все?) Символы Unicode. Собственная кодировка Python по умолчанию, которую вы видите и контролируете с помощью
sys.getdefaultencoding()
иsys.setdefaultencoding()
в этом случае игнорируется.Если вы обнаружите, что у вас есть эта проблема, вы можете исправить это,
(Или, в качестве альтернативы, выберите любую раскладку клавиатуры, которую вы хотите, вместо en_EN.) Вы также можете отредактировать
/etc/locale.conf
(или любой другой файл, который управляет определением локали в вашей системе), чтобы исправить это.источник