Ответ 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.