Как преобразовать между байтами и строками в Python 3?

Это вопрос типа Python 101, но он некоторое время меня озадачил, когда я попытался использовать пакет, который, казалось, преобразовал мой ввод строки в байты.

Как вы увидите ниже, я нашел ответ для себя, но я чувствовал, что стоит записывать здесь, потому что мне потребовалось время, чтобы раскопать то, что происходит. Это похоже на Python 3, поэтому я не ссылался на исходный пакет, с которым я играл; это не похоже на ошибку (просто, что конкретный пакет имел метод .tostring() который явно не .tostring() то, что я понимал как строку …)

Моя тестовая программа выглядит следующим образом:

 import mangler # spoof package stringThing = """  Hello World 你好  """ # print out the input print('This is the string input:') print(stringThing) # now make the string into bytes bytesThing = mangler.tostring(stringThing) # pseudo-code again # now print it out print('\nThis is the bytes output:') print(bytesThing) 

Результат этого кода дает следующее:

 This is the string input:  Hello World 你好  This is the bytes output: b'\n\n Hello World\n \xe4\xbd\xa0\xe5\xa5\xbd\n\n' 

Таким образом, необходимо иметь возможность конвертировать между байтами и строками, чтобы не допустить, чтобы символы не-ascii превращались в gobbledegook.

«Mangler» в приведенном выше примере кода делал эквивалент этого:

 bytesThing = stringThing.encode(encoding='UTF-8') 

Есть и другие способы написать это (в частности, используя bytes(stringThing, encoding='UTF-8') , но приведенный выше синтаксис делает очевидным, что происходит, а также что делать, чтобы восстановить строку:

 newStringThing = bytesThing.decode(encoding='UTF-8') 

Когда мы это делаем, исходная строка восстанавливается.

Обратите внимание, что использование str(bytesThing) просто транскрибирует все gobbledegook без преобразования его обратно в Unicode, если вы специально не запрашиваете UTF-8, а именно: str(bytesThing, encoding='UTF-8') . Не сообщается об ошибке, если кодировка не указана.

В python3 существует метод bytes() который находится в том же формате, что и encode() .

 str1 = b'hello world' str2 = bytes("hello world", encoding="UTF-8") print(str1 == str2) # Returns True 

Я ничего не читал об этом в документах, но, возможно, я не искал нужного места. Таким образом, вы можете явно перевернуть строки в streamи байтов и сделать их более читабельными, чем использование encode и decode , и без предварительного предпросмотра b перед кавычками.

ПОПРОБУЙ ЭТО:

 StringVariable=ByteVariable.decode('UTF-8','ignore') 

ТИП ИСПЫТАНИЯ:

 print(type(StringVariable)) 

Здесь «StringVariable» представлен в виде строки. «ByteVariable» представляют собой байты. Его не релевантно задавать переменные ..

Это вопрос типа Python 101,

Это простой вопрос, но ответ на этот вопрос не так прост.


В python3 объект «байтов» представляет последовательность байтов, «строковый» объект представляет последовательность кодовых точек юникода.

Для преобразования между «байтами» в «строка» и «строка» обратно в «байты» используются функции bytes.encode и string.decode. Эти функции принимают два параметра: политику кодирования и обработки ошибок.

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

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

печать (bytesThing)

Python использует «repr» как обратное преобразование в строку. rep пытается создать код python, который воссоздает объект. В случае объекта с байтами это означает, среди прочего, ускорение байтов за пределами диапазона ascii для печати.

  • Заменить разрывы строк в строке C #
  • Использование getline () в C ++
  • Преобразование в String с использованием ("" + ) плохой практики?
  • Хорошо ли использовать java.lang.String.intern ()?
  • toUpperCase в Java не работает
  • Вставка символа в определенном месте в строке
  • Самый простой способ привязать нули к строке
  • C # Разделение строк?
  • Как печатать двойные кавычки внутри ""?
  • Преобразование строки в DateTime в c #
  • Как разбить строку на многосимвольный разделитель на C #?
  • Interesting Posts

    Локальная зависимость в package.json

    Как удалить элементы из контейнеров STL?

    Счет строки и столбца в сводной таблице

    Как создается построение Perl’s @INC? (ака Какие способы повлиять на поиск модhive Perl?)

    Создание PowerShell предполагает рабочий каталог вызываемого пакетного файла

    Ioc / DI – Почему мне нужно ссылаться на все слои / сборки в приложении ввода?

    Предотвращение использования LibreOffice от использования интеллектуальных котировок ("") вместо (немых) прямых котировок?

    Лучший способ объединить два или более байтовых массива в C #

    Запуск Ubuntu без GUI

    Каковы гарантии порядка оценки, введенные C ++ 17?

    Как я могу полностью удалить Sogou Chinese IME из Windows?

    Recyclerview не вызывать onCreateViewHolder

    Перечислите последнюю базовую линию компонента в streamе UCM один за другим

    Spring Boot не служит для статического контента

    Высокоскоростные сплайновые данныеLabels перекрываются

    Давайте будем гением компьютера.