Страницы

Поиск по вопросам

суббота, 1 июня 2019 г.

Байты - перевод из строки

data = "Hello".encode("utf-8") # перевод в байты
не могу разобраться в байтах... как бы я не старался, Python мне выдает b'Hello'... как мне получить исходные байты этой строки?
Если попробовать с кириллицей, то все получается:
data = "Привет".encode("utf-8") # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
или я не имею представления о байтах? объясните пожалуйста


Ответ

Как b'Hello' так и b'\xd0\x9f\xd1\x80...' принадлежат к одному типу bytes
b'Hello' == b'\x48\x65\x6c\x6c\x6f'. Байты, которые соответствуют печатаемым ascii символам (0x20..0x7e), по умолчанию показаны как эти символы в текстовом представлении repr(data) -- синтаксис, используемый для bytes-конcтант в исходном коде Питона (eval(repr(data)) == data).
Использование символов для некоторых байтов вместо шестнадцатеричных кодов может вводить в заблуждение (как в этом случае). Легко получить hexdump, если необходимо
>>> b'Hello'.hex() '48656c6c6f'
Мотивация по использованию b'Hello' вместо b'\x48\x65\x6c\x6c\x6f' могла быть связана с тем, что многие популярные протоколы такие как HTTP свободно смешивают текст (закодированный в ascii-совместимой кодировке) и двоичные данные. Поэтому использование символов вместо hex-кодов может помочь при отладке.
Недостаток использования b'Hello' вместо b'\x48\x65\x6c\x6c\x6f' состоит в том что люди смешивают понятия текста (Юникодные строки) и двоичных данных (байтов), что ведёт к путанице и в итоге мусору (кракозябрам) в результатах. Что было особенно остро на Питоне 2, где str = bytes. See Stop displaying elements of bytes objects as printable ASCII characters in CPython 3 [python-ideas mailing list (2014)]
Без явного указания кодировки, последовательность байтов (bytes объект) является просто набором чисел. Последовательность байтов становится текстом только, если байты декодированы, используя подходящую кодировку:
unicode_text = bytestring.decode(character_encoding)

Комментариев нет:

Отправить комментарий