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

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

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

Ответ 1

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

>>> 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'

Ответ 2

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

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

  • Если вы хотите сохранить музыку, вы должны сначала закодировать ее, используя 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'.

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

Ответ 3

В 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.

Ответ 4

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

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

......

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'))
中文 

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

Ответ 5

Юникод - это согласованный формат для двоичного представления символов и различных видов форматирования (например, строчные/прописные буквы, новая строка, возврат каретки) и других "вещей" (например, смайликов). Компьютер не менее способен хранить представление в юникоде (последовательность битов) в памяти или в файле, чем для хранения представления ascii (другая серия битов) или любого другого представления (серии битов).).

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

Поскольку юникод стремится представлять все возможные символы (и другие "вещи"), используемые в меж-человеческом и межкомпьютерном общении, ему требуется большее количество бит для представления многих символов (или вещей), чем в других системах представления, которые стремиться представлять более ограниченный набор символов/вещей. Чтобы "упростить" и, возможно, учесть историческое использование, представление в юникоде почти исключительно преобразуется в какую-то другую систему представления (например, ascii) с целью хранения символов в файлах.

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

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