#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 (или документах для набора символов в целом). Можете ли вы указать мне на ссылку?