Почему пустая строка '' кодируется в 2 байта в utf-16, а 0 байтов в utf-8 или ascii? - PullRequest
1 голос
/ 14 мая 2019

Я только что узнал о кодировании строк в python и, немного поигравшись с ним, меня смутил тот факт, что размер пустой строки ('') равен 0 в utf 8 и ascii, но как-то 2 в utf 16 ? как получилось?

print(len(''.encode('utf16'))) # is 2
print(len(''.encode('utf8'))) # is 0

Полагаю, большая часть проблемы в том, что я не понимаю, как работает utf 16. Я не понимаю, почему кодирование «спама» в utf 16 должно быть длиной 10 байт вместо 8 байтов (2 байта (16 бит) для каждого символа). Я предполагаю, что 2 байта необходимы в UTF 16 по умолчанию для любой строки для заполнения или что-то?

* редактировать

Меня НЕ смущают основы того, как работают UTF 8 или UTF 16, и различаются они для хранения каждого отдельного символа. Меня смущает, как отсутствие каких-либо символов (пустая строка) будет храниться в 2 байтах в UTF 16, но иметь 0 байтов в UTF 8. (в отличие от 1 байта или 0 для обоих)

Ссылка не дает ответа на мой вопрос.

1 Ответ

4 голосов
/ 14 мая 2019

По умолчанию Python включает Порядок следования байтов при кодировании в UTF-16, но не при кодировании в UTF-8.

>>> ''.encode('utf16')
b'\xff\xfe'
>>> ''.encode('utf8')
b''

Вы можете подавить спецификацию, явно указав порядок байтов с суффиксом BE (Big-Endian) или LE (Little-Endian).

>>> ''.encode('utf-16-le')
b''
...