Существуют десятки, если не сотни, кодировок символов. Понять эту концепцию легче всего, разобрав одну из самых простых, ASCII.
Независимо от того, занимаетесь вы самообразованием или получили более формальное образование в сфере IT , наверняка пару раз вы уже видели таблицу ASCII. Эта таблица — хорошее начало для изучения принципов кодировки, так как она простая и маленькая (как вы увидите дальше, даже слишком маленькая).
Она охватывает следующее:
Символы английского алфавита в нижнем регистре: от a до z;
Символы английского алфавита в верхнем регистре: от A до Z;
Некоторые знаки препинания и символы: например «$» или «!»;
Символы, отображаемые как пустое место: пробел (« »), символ новой строки, возврата каретки, горизонтальной и вертикальной табуляции и несколько других;
Некоторые непечатаемые символы: такие как бекспейс, «\b», которые просто невозможно отобразить, так, как к примеру, букву А.
Приведём формальное определение кодировки символов.
На самом высоком уровне — это способ перевода символов (таких как буквы, знаки пунктуации, служебные знаки, пробелы и контрольные символы) в целые числа и затем непосредственно в биты. Каждый символ может быть закодирован уникальным двоичным кодом. Если вы плохо знакомы с концепцией битов, не волнуйтесь, мы вскоре о ней поговорим.
Группы символов выделяют в отдельные категории. Каждому символу соответствует кодовая точка, которую можно рассматривать просто как целое число. В таблице ASCII символы сегментированы следующим образом:
Диапазон кодовых точек
Класс
от 0 до 31
Контрольные и неотображаемые символы
от 32 до 64
Знаки пунктуации, символы, числа и пробел
от 65 до 90
Буквы английского алфавита в верхнем регистре
от 91 до 96
Дополнительные графемы, такие как [ и \
от 97 до 122
Буквы английского алфавита в нижнем регистре
от 123 до 126
Дополнительные графемы, такие как { и |
127
Контрольный неотображаемый символ (DEL)
Всего кодировка ASCII содержит 128 символов. В таблице ниже вы видите исчерпывающий набор знаков, которые позволяет отобразить эта кодировка. Если вы не видите какого-то символа, значит вы просто не сможете его вывести с помощью ASCII.
Тип char – это тип данных, служащий для хранения одиночных символов в различных кодировках.
Он широко используется в более низкоуровневых языках программирования, таких как C. Даже строки там являются массивами, состоящими из элементов типа char.
В Python нет отдельного типа для символов. Даже если присвоить переменной значение ‘а’, она будет иметь строковый тип.
Разработчики языка решили, что нет необходимости выделять под отдельные символы целый тип. На то есть несколько причин:
Строковый тип предоставляет программисту весь нужный функционал для работы как со строками, так и с символами.
Python – язык с динамической типизацией, разделение на строковый и символьный тип добавило бы дополнительных проблем с реализацией автоматического определения типов.
Поэтому как бы программист ни пытался, переменные будут иметь строковый тип:
s = 'a'
print(type(s))
<class 'str'>
s = 'Hello'
s = s[0] # Присваиваем переменной элемент 'H'
print(type(s))
<class 'str'>
Любой символ в Python является единичной строкой, что позволяет использовать для работы с ним те же функции, что и для строк.
Строка — это неизменяемая последовательность, а так как символ тоже строка, то при попытке изменить его, возбудится исключение:
s = 'О'
s[0] = 'А' # Исключение TypeError
Чтобы изменить символ, его необходимо заново присвоить переменной.
Несмотря на объединение двух типов, язык программирования Python 3 имеет функции для работы именно с символами.
Каждый элемент строки — закодированная последовательность битов. В Python символы могут быть представлены в виде целого числа int. Для работы с их обычным и числовым представлением используют встроенные функции ord() и chr().
Функция возвращает числовое представление символа, переданного в качестве аргумента. То есть с её помощью в Python можно определить код символа (аналогичная функция есть и в C для приведения char к int), например:
ord('~')
результат: 126
ord('¾')
результат: 190
Функция работает, только если в качестве аргумента передан один символ, при попытке передать строку возбудится исключение TypeError. С её помощью можно получить числовое представление любого символа кодировки Юникод.
Функция возвращает символ, соответствующий его числовому представлению, которое передается в качестве аргумента:
chr(126)
результат: ~
chr(190)
результат: ¾
chr(11141112)
исключение ValueError
В качестве аргумента можно передать любое целое неотрицательное число вплоть до 1114111. В противном случае возбудится исключение ValueError.
По сути ord() и chr() – это две взаимно обратные функции, которые чаще всего используются вместе.
Экранированные символы — это специальные символы после обратной косой черты “\”, выполняющие определенные действия и преобразования.
Экранированная последовательность
Функция
\n - Переход на новую строку
\t - Табуляция
\r - Возврат каретки в начало строки
\x - Числа в шестнадцатеричном представлении
\o - Числа в восьмеричном представлении
\0 - Нулевой символ
\’ - Апостроф
\” - Двойная кавычка
\\ - Обратный слэш
Экранированные символы также называются escape-последовательностями, с их помощью можно, например, форматировать строки –
s = "Привет,\n\"Сергей\""
print(s) #Выведет:
Привет,
"Сергей"
Иногда программисту нужно, чтобы обратный слеш не превращал элементы в escape-последовательности, например, при работе с путями к файлам. Для этого необходимо использовать сразу две косых черты: “C:\\Users\\Public”.
Когда программист хочет использовать обратный слеш для вывода, но не подавляет экранирование, в некоторых случаях даже возбуждается исключение. В следующем примере есть синтаксическая ошибка из-за того, что с “\U” начинается записть 32-битного символа Юникода (с “\u” – 16-битного). После него должна быть последовательность из 8 цифр, поэтому возникла ошибка:
s = "C:\Users\Public"
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in
position 2-3: truncated \UXXXXXXXX escape
Чтобы избежать этого, используют приём подавления экранирования:
s = r"C:\Users\Public"
print(s)
C:\Users\Public
Подавить экранирование можно с помощью “r”, который ставится перед началом строки (до кавычек). На самом деле интерпретатор, видя перед строкой “r”, автоматически дублирует каждый символ обратного слеша. Если использовать это в интерактивном режиме, мы увидим:
>>> s = r"C:\Users\Public"
>>> s
'C:\\Users\\Public'
Строка, в которой подавляется экранирование, не может оканчиваться символом обратного слеша. В противном случае интерпретатор возбудит исключение SyntaxError.
Решить эту проблему можно несколькими способами:
Дублировать символы экранирования вручную.
Использовать конкатенацию: s = r"Привет,\nмир" + "\\".
Работа с символами
Пользователь вводит англ. букву, вывести следующие три по алфавиту. Если алфавит закончился, то вывести циклично с начала алфавита, то есть если z, то a b c. Вывод только маленьких букв. Учесть, что пользователь может ввести заглавную
2. Вывести англ. алфавит по 5 букв в строке.
3. Вывести квадрат 7 на 7 из случайных букв. Материал сайта www.itmathrepetitor.ru
4. Пользователь вводит положительное целое число. Зашифровать каждую цифру серией из букв (конкретный принцип составления серии букв разработать самостоятельно).
5. Сгенерируйте строку символов длины от 3 до 10, в которой ровно 2 символа "!".
6. Сгенерировать пароль для пользователя. Требования: длина от 6 до 20 символов, должен быть ровно один символ подчеркивания, хотя бы две заглавных буквы, не более 5 цифр, любые две цифры подряд недопустимы.