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

Что именно является строкой Unicode?

В чем разница между обычной строкой и строкой Юникода?

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

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

i18n Strings (Юникод)

> 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's the same as the original, yay!
True

Файлы Юникод

import codecs

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

2 ответа

Решение

Этот ответ о Python 2. В Python 3 str является строкой Юникода.

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

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

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

Питона 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.

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

Другие вопросы по тегам