Страница Unicode Code Charts (http://www.unicode.org/charts) содержит ссылки на все определенные на данный момент наборы символов с изображениями. В последней версии (6.2) определяется более 110 000 символов, каждый из которых имеет уникальное имя и идентификационный номер. Символы разбиты на восьмибитные наборы, которые называются
Строки в Python 3 являются строками формата Unicode, а не массивом байтов. Одним разграничением между обычными байтовыми строками и строками в формате Unicode Python 3 значительно отличается от Python 2.
Если вы знаете Unicode ID или название символа, то можете использовать его в строке Python. Вот несколько примеров.
• Символ \u, за которым располагаются четыре шестнадцатеричных числа (числа шестнадцатеричной системы счисления, содержащие символы от 0 до 9 и от A до F), определяют символ, находящийся в одной из 256 многоязычных плоскостей Unicode. Первые два числа являются номером плоскости (от 00 до FF), а следующие два — индексом символа внутри плоскости. Плоскость с номером 00 — это старый добрый формат ASCII, и позиции символов в нем такие же, как и в ASCII.
• Для символов более высоких плоскостей нужно больше битов. Управляющая последовательность для них выглядит как \U, за которым следуют восемь шестнадцатеричных символов, крайний слева из них должен быть равен 0.
• Для всех символов конструкция \N{ имя } позволяет указать символ с помощью его стандартного
Модуль unicodedata содержит функции, которые преобразуют символы в обоих направлениях:
• lookup() принимает не зависящее от регистра имя и возвращает символ Unicode;
• name() принимает символ Unicode и возвращает его имя в верхнем регистре.
В следующем примере мы напишем проверочную функцию, которая принимает символ Unicode, ищет его имя, а затем ищет символ, соответствующий полученному имени (он должен совпасть с оригинальным):
>>> def unicode_test(value):
…·····import unicodedata
…·····name = unicodedata.name(value)
…·····value2 = unicodedata.lookup(name)
…·····print('value="%s", name="%s", value2="%s"' % (value, name, value2))
…
Попробуем проверить несколько символов, начиная с простой буквы формата ASCII:
>>> unicode_test('A')
value="A", name="LATIN CAPITAL LETTER A", value2="A"
Знак препинания, доступный в ASCII:
>>> unicode_test('$')
value="$", name="DOLLAR SIGN", value2="$"
Символ валюты из Unicode:
>>> unicode_test('\u00a2')
value="¢", name="CENT SIGN", value2="¢"
Еще один символ валюты из Unicode:
>>> unicode_test('\u20ac')
value="€", name="EURO SIGN", value2="€"
Единственная проблема, с которой вы можете столкнуться, — это ограничения, накладываемые шрифтом. Ни в одном шрифте нет символов для всех символов Unicode, вместо них будет отображен символ-заполнитель. Например, так выглядит символ Unicode SNOWMAN, содержащийся в пиктографических шрифтах:
>>> unicode_test('\u2603')
value="☃", name="SNOWMAN", value2="☃"
Предположим, мы хотим сохранить в строке слово café. Одно из решений состоит в том, чтобы скопировать его из файла или с сайта и понадеяться, что это сработает:
>>> place = 'café'
>>> place
'café'
Это сработало, поскольку я скопировал это слово из источника, использующего кодировку UTF-8 (с которой вы познакомитесь далее), и вставил его.
Как же нам указать, что последний символ — это «é»? Если вы посмотрите на индекс символа «Е», вы увидите, что имя E WITH ACUTE, LATIN SMALL LETTER имеет индекс 00Е9. Рассмотрим функции name() и lookup(), с которыми мы только что работали. Сначала передадим код символа, чтобы получить его имя:
>>> unicodedata.name('\u00e9')
'LATIN SMALL LETTER E WITH ACUTE'
Теперь найдем код для заданного имени:
>>> unicodedata.lookup('E WITH ACUTE, LATIN SMALL LETTER')