Что такое строка в юникоде?
Что именно является строкой 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 не имеет кодировки, потому что он не содержит символов.