Что такое строка в Юникоде?

Что такое строка в Юникоде?

Какая разница между регулярной строкой и строкой Unicode?

Что такое utf-8?

Я пытаюсь изучить Python прямо сейчас, и я продолжаю слышать это модное слово. Что делает код ниже?

i18n Строки (Unicode)

> ustring = u'A unicode \u018e string \xf1'
> ustring
u'A unicode \u018e string \xf1'

## (ustring from above contains a unicode string)
> s = ustring.encode('utf-8')
> s
'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding
> t = unicode(s, 'utf-8')             ## Convert bytes back to a unicode string
> t == ustring                      ## It the same as the original, yay!
True

Файлы Unicode

import codecs

f = codecs.open('foo.txt', 'rU', 'utf-8')
for line in f:
# here line is a *unicode* string

Ответ 1

Этот ответ о Python 2. В Python 3, str является строкой Unicode.

Тип Python str - это набор 8-битных символов. Английский алфавит может быть представлен с использованием этих 8-битных символов, но символы, такие как ±, ♠, Ω и ℑ, не могут.

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

UTF-8 является одним из таких кодировок. Низкие кодовые точки кодируются с использованием одного байта, а более высокие кодовые точки кодируются как последовательности байтов.

Тип Python unicode - это набор кодовых точек. Строка ustring = u'A unicode \u018e string \xf1' создает строку Unicode с 20 символами.

Когда интерпретатор Python отображает значение ustring, он пропускает два символа (Ǝ и ñ), потому что они не входят в стандартный диапазон печати. ​​

Строка s = unistring.encode('utf-8') кодирует строку Unicode, используя UTF-8. Это преобразует каждую кодовую точку в соответствующий байт или последовательность байтов. Результатом является набор байтов, который возвращается как str. Размер s равен 22 байтам, потому что два из символов имеют высокие кодовые точки и кодируются как последовательность из двух байтов, а не один байт.

Когда интерпретатор Python отображает значение s, он пропускает четыре байта, которые не находятся в диапазоне печати (\xc6, \x8e, \xc3 и \xb1). Две пары байтов не рассматриваются как одиночные символы, как раньше, потому что s имеет тип str, а не unicode.

Линия t = unicode(s, 'utf-8') выполняет противоположную функцию encode(). Он восстанавливает исходные кодовые точки, просматривая байты s и анализируя байтовые последовательности. Результатом является строка Unicode.

Вызов codecs.open() указывает utf-8 как кодировку, которая сообщает Python интерпретировать содержимое файла (набор байтов) как строку Unicode, которая была закодирована с использованием UTF-8.

Ответ 2

Python поддерживает тип строки и тип юникода. Строка представляет собой последовательность символов, а юникод - последовательность "указателей". Unicode представляет собой представление последовательности в памяти, и каждый символ на нем не является char, а числом (в шестнадцатеричном формате), предназначенным для выбора char на карте. Таким образом, unicode var не имеет кодировки, поскольку он не содержит символов.