строка байта и строка unicode. питон

Не могли бы вы подробно объяснить, какая разница между байтовой строкой и строкой Unicode в Python. Я прочитал:

Байт-код – это просто преобразованный исходный код в массивы байтов

Означает ли это, что у Python есть собственный формат кодирования / кодирования? Или он использует настройки операционной системы? Я не понимаю. Не могли бы вы объяснить? Спасибо!

3 Solutions collect form web for “строка байта и строка unicode. питон”

Ни один python не использует свою собственную кодировку. Он будет использовать любую кодировку, к которой он имеет доступ и который вы укажете. Символ на str представляет один символ Юникода. Однако, чтобы представить более 256 символов, отдельные кодировки Unicode используют более одного байта на символ для представления многих символов. объекты bytearray дают вам доступ к нижним байтам. str имеют метод encode который принимает строку, представляющую кодировку, и возвращает объект bytearray который представляет строку в этой кодировке. Объекты bytearray имеют метод decode который принимает строку, представляющую кодировку, и возвращает строку, которая возникает в результате интерпретации bytearray как строки, закодированной в данной кодировке. Вот пример.

 >>> a = "αά".encode('utf-8') >>> a b'\xce\xb1\xce\xac' >>> a.decode('utf-8') 'αά' 

Мы видим, что UTF-8 использует четыре байта, \ xce, \ xb1, \ xce и \ xac для представления двух символов. После статьи Спольского, о которой упоминал Игнасио Васкес-Абрамс, я бы прочитал книгу « Юникод» на Python .

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

Предположим, вы создали строку с использованием Python 3 обычным способом:

 stringobject = 'ant' 

stringobject будет строкой unicode.

Строка Unicode состоит из символов Unicode. В stringobject выше stringobject символы юникода – это отдельные буквы, например a, n, t

Каждому символу юникода присваивается кодовая точка, которая может быть выражена в виде последовательности шестнадцатеричных цифр (шестнадцатеричная цифра может принимать 16 значений, начиная от 0-9 и AF). Например, буква 'a' эквивалентна '\u0091' , а «муравей» эквивалентно '\u0061\u006E\u0074' .

Таким образом, вы обнаружите, что если вы введете,

 stringobject = '\u0061\u006E\u0074' stringobject 

Вы также получите выход 'ant' .

Теперь unicode преобразуется в байты в процессе, известном как кодирование . Обратный процесс преобразования байтов в unicode известен как декодирование .

Как это делается? Поскольку каждая шестнадцатеричная цифра может принимать 16 разных значений, она может быть отражена в 4-битной двоичной последовательности (например, шестнадцатеричная цифра 0 может быть выражена в двоичном формате как 0000, шестнадцатеричная цифра 1 может быть выражена как 0001 и т. Д.). Если символ Юникода имеет кодовую точку, состоящую из четырех шестизначных цифр, для ее кодирования потребуется 16-разрядная двоичная последовательность.

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

Например, система кодирования ASCII использует только 8 бит (1 байт) на символ. Таким образом, он может кодировать только символы Юникода с кодовыми точками длиной до двух шестнадцатеричных цифр (т.е. 256 разных символов Юникода). Система кодирования UTF-8 использует от 8 до 32 бит (от 1 до 4 байтов) для каждого символа, поэтому она может кодировать символы юникода с кодовыми точками длиной до 8 шестнадцатеричных цифр, то есть всего.

Выполнение следующего кода:

 byteobject = stringobject.encode('utf-8') byteobject, type(byteobject) 

преобразует строку unicode в байтовую строку с использованием системы кодирования utf-8 и возвращает b'ant', bytes' .

Обратите внимание, что если вы использовали «ASCII» в качестве системы кодирования, вы не столкнулись бы с какими-либо проблемами, поскольку все кодовые точки в «ant» могут быть выражены с помощью 1 байта. Но если бы у вас была строка unicode, содержащая символы с кодовыми точками длиннее двух шестнадцатеричных цифр, вы получили бы UnicodeEncodeError .

По аналогии,

 stringobject = byteobject.decode('utf-8') stringobject, type(stringobject) 

дает вам 'ant', str .

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

  • Замените символы пунктуации полной ширины эквивалентными эквивалентами ширины
  • Как преобразовать символы Unicode в float в Python?
  • Tokenizing unicode с помощью nltk
  • Конвертировать или вырезать «незаконные» символы Юникода
  • Строки Unicode в Python 3 все еще зависят от «узких» / «широких» построений?
  • Персонаж \ u260e
  • Чтение unicodecsv из строки unicode не работает?
  • Кодирование кода кодирования Unicode Python не в диапазоне <128> с знаком Euro
  • Python - лучший язык программирования в мире.