Простой Python. Современный стиль программирования (Любанович) - страница 100

>>>> 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')

>Traceback (most recent call last):

>··File "", line 1, in

>KeyError: "undefined character name 'E WITH ACUTE, LATIN SMALL LETTER'"


Имена, перечисленные в списке Unicode Character Name Index, были переформатированы для удобства отображения. Для того чтобы преобразовать их в настоящие имена символов Unicode (которые используются в Python), удалите запятую и переместите ту часть имени, которая находится после нее, в самое начало. Соответственно, в нашем примере E WITH ACUTE, LATIN SMALL LETTER нужно изменить на LATIN SMALL LETTER E WITH ACUTE:

>>>> unicodedata.lookup(‘LATIN SMALL LETTER E WITH ACUTE’)

>'é'


Теперь мы можем использовать символ «é» как с помощью кода, так и с помощью имени:

>>>> place = 'caf\u00e9'