Питон: Как я могу добавить литеральные байты в строку без декодирования?

#python #character-encoding

Вопрос:

В Python строка может содержать произвольные байты с помощью "x??" экранирования. Эти байты не обязательно должны сопоставляться с символом в кодировке. Например, мы можем иметь "xa0" , даже если 0xa0 не является хорошим символом utf-8.

Однако, если у меня есть массив байтов, например b'xa0' , я не могу добавить его в строку без ее декодирования. Что, если я хочу просто добавить буквально, просто так "xa0" ?

Как я могу добавить ряд байтов в строку, не расшифровывая их вообще, точно так же, как "x" escape-символы? Существует ли опция «буквальное декодирование» или «без декодирования» decode() ? Если нет, есть ли другой способ сделать это?

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

1. Почему вам нужно, чтобы в итоге получилась строка? Можете ли вы просто сохранить все данные в a bytearray ?

2. Попробуйте «latin1» при декодировании.

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

4. Это ужасно похоже на то, что bytes сделал бы объект

5. Я согласен с @SuperStormer. latin1 вероятно, это то, чего вы хотите. Это однозначное преобразование байтов в символы с одинаковым значением.

Ответ №1:

Во-первых, подумайте, действительно ли хранение их в строке лучше всего подходит для вашего использования. Хранение в виде байтов/байтового массива обычно является более идиоматичным вариантом.

Однако, если вы обдумали это и все же решили продолжить, то вам следует передать "latin1" в качестве опции кодирования bytes.decode . Это преобразует байты непосредственно в символы с соответствующим значением.

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

1. Спасибо. Это не для внутреннего использования, а для случая, когда мне нужен строковый объект с определенными байтами. Я протестировал и latin1 работает так, как вы описываете, но не смог найти это в документах Python (или документах для набора символов в целом). Можете ли вы указать мне на ссылку?