В чем разница между строкой и строкой байтов?

Я работаю с библиотекой, которая возвращает строку байта, и мне нужно преобразовать ее в строку.

хотя я не уверен, в чем разница - если есть.

4 ответов


предполагая Python 3 (в Python 2 эта разница немного менее четко определена) - строка представляет собой последовательность символов, т. е. Unicode код; это абстрактное понятие, и не может быть напрямую сохранены на диске. Байтовая строка-это последовательность, неудивительно, байтов-вещей, которые can храниться на диске. Отображение между ними является кодирование - их довольно много (и бесконечно много возможно) - и вам нужно знать, какие применяется в конкретном случае для выполнения преобразования, поскольку другая кодировка может сопоставлять одни и те же байты с другой строкой:

>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'

как только вы знаете, какой из них использовать, вы можете использовать .decode() метод байтовой строки, чтобы получить правильную символьную строку из нее, как указано выше. Для полноты .encode() метод символьной строки идет в обратном направлении:

>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'

единственное, что компьютер может хранить это байты.

для хранить что-либо в компьютере, вы должны сначала кодирование it, т. е. преобразовать его в байты. Например:

  • если вы хотите хранить музыку, вы должны сначала кодирование он с помощью MP3, WAV, etc.
  • если вы хотите сохранить изображение, вы должны сначала кодирование он с помощью PNG, JPEG, etc.
  • если вы хотите сохранить текст, вы должны сначала кодирование он с помощью ASCII, UTF-8, etc.

MP3, WAV, PNG, JPEG, ASCII и UTF-8 примеры кодировок. Кодировка-это формат для представления аудио, изображений, текста и т. д. в байтах.

в Python байтовая строка - это просто последовательность байтов. Она не читается человеком. Под капотом все должно быть преобразовано в байтовую строку, прежде чем ее можно будет сохранить в компьютер.

С другой стороны, символьная строка, часто называемая "строкой", представляет собой последовательность символов. Он удобочитаем. Символьная строка не может быть непосредственно сохранена на компьютере, она должна быть закодированных first (преобразуется в байтовую строку). Существует несколько кодировок, с помощью которых символьная строка может быть преобразована в байтовую строку, например ASCII и UTF-8.

'I am a string'.encode('ASCII')

приведенный выше код Python будет кодировать строку 'I am a string' использование кодировки ASCII. Результатом этого кода будет строка байтов. Если вы его напечатаете, Python будет представлять его как b'I am a string'. Помните, однако, что байтовые строки не читаются человеком, просто Python декодирует их из ASCII когда вы будете печатать их. В Python байтовая строка представлена b, за которым следует строка байта ASCII представление.

строка байта может быть декодируются в строку символов, если вы знать кодировку, которая использовалась для его кодирования.

b'I am a string'.decode('ASCII')

приведенный выше код вернет исходную строку 'I am a string'.

кодирование и декодирование являются обратными операциями. Все должно быть закодировано, прежде чем его можно записать на диск, и оно должно быть декодировано, прежде чем его сможет прочитать человек.


В Python 2, str состоит из последовательностей 8-битных значений, в то время как unicode состоит из последовательности символов Unicode. Одна вещь, чтобы иметь в виду, что str и unicode может использоваться вместе с операторами if str состоит только из 7-битных символов ASCI.

В Python 3, bytes состоит из последовательностей 8-битных значений, в то время как str состоит из последовательности символов Unicode. bytes и strнельзя использовать вместе с операторами типа > или +.

это может быть полезно использовать вспомогательные функции для преобразования между str и unicode в Python 2, и между bytes и str в Python 3.


С Что такое Unicode:

в принципе, компьютеры просто имеют дело с числами. Они хранят буквы и другие символы, назначая номер для каждого из них.

......

Unicode предоставляет уникальный номер для каждого символа, независимо от платформы, независимо от программы, независимо от языка.

поэтому, когда компьютер представляет строку, он находит символы, хранящиеся в компьютер строки через их уникальный номер Unicode и эти цифры хранятся в памяти. Но вы не можете напрямую записать строку на диск или передать строку по сети через их уникальный номер Unicode, потому что эти цифры-просто десятичное число. Вы должны кодировать строку в байтовую строку, например UTF-8. UTF-8 - это кодировка символов, способная кодировать все возможные символы, и она хранит символы в виде байтов (это похоже на этой). Так закодировано строка может использоваться везде, потому что UTF-8 почти везде поддерживается. При открытии текстового файла, закодированного в UTF-8 из других систем ваш компьютер будет декодировать его и отображать символы в нем через их уникальный номер Unicode. Когда браузер получает строковые данные, закодированные UTF-8 из сети, он будет декодировать данные в строку (предполагается, что браузер в UTF-8 encoding) и отобразить строку.

в python3 вы можете преобразовать строку и байтовую строку в каждую другое:

>>> print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文 

в слове, строка для показа к людям для чтения на компьютере и строка байта для хранить к диску и передаче данных.