В чем разница между строкой и байтовой строкой? - PullRequest
147 голосов
/ 03 июня 2011

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

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

Ответы [ 4 ]

296 голосов
/ 09 июля 2015

Компьютер может хранить только байты.

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

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

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

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

С другой стороны, строка символов, которую часто называют просто «строкой», представляет собой последовательность символов. Это читабельно для человека. Строка символов не может быть напрямую сохранена на компьютере, сначала она должна быть кодирована (преобразована в строку байтов). Существует несколько кодировок, с помощью которых символьная строка может быть преобразована в байтовую строку, например 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'.

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

194 голосов
/ 03 июня 2011

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

>>> 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'
10 голосов
/ 04 сентября 2017

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

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

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

3 голосов
/ 23 апреля 2017

С Что такое Юникод :

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

......

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

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

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

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

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

...