Python: UnicodeDecodeError с кодировкой ASCII по умолчанию - PullRequest
0 голосов
/ 03 июля 2018

Я делаю некоторую обработку текста в Python 2.7 с кодировкой ASCII по умолчанию. Я получаю UnicodeDecodeError при попытке закодировать некоторые из моих строк в utf-8. В частности, для каждого слова в моем документе я делаю это:

word = word.encode('utf-8')

Это хорошо работает, когда все мои персонажи ASCII, но когда нет, я получаю:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 5: ordinal not in range(128)

Я в замешательстве, так как думал, что вызов encode превратит все из ASCII в utf-8. Так как utf-8 является расширенным набором ASCII, у меня не должно быть проблем ... но у меня есть.

Кроме того, я не уверен, почему говорится, что ASCII не может декодировать , когда я ожидал, что ASCII не может кодировать мое слово в utf-8.

Любая помощь будет потрясающей!

1 Ответ

0 голосов
/ 03 июля 2018

Вы кодируете в байтовые строки, декодируете в строки Unicode. Поэтому для кодирования в байтовую строку UTF-8 начните со строки Unicode. Если вы начинаете с байтовой строки, Python 2.7 неявно декодирует ее в Unicode, используя сначала кодек ASCII по умолчанию. Если ваша байтовая строка содержит не-ASCII, вы получите UnicodeDecodeError.

Python 3 удаляет неявное декодирование в Unicode, когда вы начинаете со строки байтов, и фактически .encode() недоступно в байтовых строках, а .decode недоступно в строках Unicode. Python 3 также изменяет кодировку по умолчанию на UTF-8.

Примеры:

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 'café'.encode('utf8')  # Started with a byte string
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 3: ordinal not in range(128)
>>> u'café'.encode('utf8')  # Started with Unicode string
'caf\xc3\xa9'

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 'café'.encode()  # Starting with a Unicode string, default UTF-8.
b'caf\xc3\xa9'
>>> 'café'.decode()  # You can only *encode* Unicode strings.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'

Дальнейшее чтение: https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...