Почему я не могу декодировать \xDF (ß) в UTF-8?

У меня есть строка b"\xDF", Когда я пытаюсь декодировать его в UTF-8, генерируется ошибка UnicodeDecodeError. Декодирование в CP1252 работает нормально. В обеих кодировках 0xDF представлен символом "ß". Так почему ошибка?

>>> hex(ord("ß"))
'0xdf'
>>> b"\xDF".decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdf in position 0: unexpected end of data
>>> b"\xDF".decode("cp1252")
'ß'

1 ответ

Решение

Все однобайтовые символы в кодировке UTF-8 должны находиться в диапазоне [0x00.. 0x7F] ( https://en.wikipedia.org/wiki/UTF-8). Это эквивалентно 7-битному ASCII.

Для немца ßвы получите 2 байта в UTF-8:

>>> "ß".encode("utf-8")

Ь '\xc3\x9f'

Который также работает правильно при декодировании:

b'\xc3\x9f'.decode("utf-8")

'Ss'

Другие вопросы по тегам