Почему пустая строка '' закодирована в 2 байта в utf-16, но 0 байтов в utf-8 или ascii?

Я только что узнал о кодировании строк в 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 для обоих)

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


person Wooyoung Cho    schedule 14.05.2019    source источник
comment
Дублирующаяся ссылка неверна: разница здесь в спецификации, а не в кодировке как таковой.   -  person dan04    schedule 14.05.2019


Ответы (1)


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

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

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

>>> ''.encode('utf-16-le')
b''
person dan04    schedule 14.05.2019