Экранирование и кодирование символов
Программирование на Python требует внимания ко многим деталям, особенно когда речь идет о работе с текстом. Экранирование символов помогает интерпретатору понимать специальные команды внутри строковых литералов, тогда как выбор правильной кодировки обеспечивает согласованное представление текста независимо от платформы и устройства.
Управляющие символы
В Python некоторые комбинации символов, начинающиеся с обратного слэша
, интерпретируются особым образом. Такие комбинации называют управляющими символами, или escape-последовательностями. Они необходимы для задания специфичных действий в тексте, таких как перенос строки, табуляция или возврат каретки.\
Рассмотрим наиболее часто используемые управляющие символы в Python.
Управляющий символ | Назначение |
---|---|
\n (от англ. newline – новая строка) |
Перенос строки |
\t (от англ. tab – табуляция) |
Добавление табуляции (отступа) |
\r (от англ. return – вернуться) |
Возврат каретки в начало строки |
\b (от англ. backspace – пробел назад) |
Удаление последнего символа |

Термин «каретка» широко применяется программистами для обозначения позиции текстового курсора, указывающей место ввода. Однако каретка и управляющие символы берут свое происхождение от механических пишущих машинок. Раньше кареткой называли подвижную часть машинки, которая определяла положение печатающего элемента. Клавиши вроде «Перевод строки» и «Возврат каретки» помогали операторам начинать новые строки и возвращаться к началу текущей строки соответственно. Со временем эти термины перешли в компьютер, сохранив свое первоначальное функциональное предназначение.
Символ переноса строки \n
позволяет вывести на экран несколько строк текста без использования дополнительных вызовов функции print()
:
poem = "Духовной жаждою томим,\nВ пустыне мрачной я влачился."
print(multiline_string)
Здесь символ \n
указывает Python, что после "Духовной жаждою томим,"
следует перейти на новую строку:
Духовной жаждою томим,
В пустыне мрачной я влачился.
Символ добавления табуляции \t
полезен, когда необходимо добавить отступ, например, для выравнивания столбцов при выводе таблицы:
countries = "Страна\tСтолица\nРоссия\tМосква\nКитай\tПекин"
print(countries)
При выводе такой строки на экран каждый столбец «Страна-Столица» отделен отступом:
Страна Столица
Россия Москва
Китай Пекин
Символ возврата каретки \r
перемещает курсор в начало текущей строки. Если после этого выводится новый текст, он перезаписывает существующий:
print("Или вырубишь\rЧто написано пером, не вырубишь топором")
print("Хотя если сообщение о-очень длинное, то вырубишь только часть\rЧто написано пером, не вырубишь топором")
Здесь в первой строке часть до символа \r
будет перезаписана полностью, а во второй – частично, так как она длиннее:
Что написано пером, не вырубишь топором
Что написано пером, не вырубишь топором вырубишь только часть
Символ перевода каретки назад \b
удаляет последний символ:
print("123\b45")
print("Ой ты\b\b\b, степь широкая!")
Подряд можно использовать несколько управляющих символов, поэтому во втором примере полностью удалена строка " ты"
:
1245
Ой, степь широкая!
Экранирование символов
Часто может возникнуть ситуация, когда строка должна содержать специальный символ, который сам по себе имеет особое значение в Python (например, кавычки или обратный слэш). Без правильного обращения такие символы будут неправильно обработаны интерпретатором.
Рассмотрим простой случай, когда нужно сохранить путь к файлу в Windows:
path = "C:\Python projects\task.py"
print(path)
Результат вывода такой строки на экран будет неожиданным:
C:\Python projects ask.py
Появление отступа связано с тем, что комбинация
в \t
\task.py
рассматривается Python как управляющий символ, обозначающий добавление табуляции. Чтобы исправить эту ситуацию, нужно экранировать символ обратной косой черты, добавив перед ней ещё один обратный слэш:
path = "C:\\Python projects\\task.py"
print(path)
Теперь путь выводится корректно, так как каждый символ \
был экранирован:
C:\Python projects\task.py
Экранирование позволяет позволяет указать интерпретатору, что конкретный символ следует воспринимать буквально, а не как служебный знак. Поэтому мы даже можем включить в строку кавычки того же типа, что используются для ее определения:
print("На сцене ставили \"Колобок\"")
# Вывод: На сцене ставили "Колобок"
Необработанные строки
Однако экранирование каждого специального символа вручную может показаться неудобным и сделать строку трудночитаемой. Поэтому Python предлагает альтернативный способ: необработанные строки (англ. – raw strings). В таких строках любая комбинация символов, включающих обратный слэш, интерпретируется буквально, а не как управляющая последовательность.
Создать необработанную строку можно с помощью префикса r
перед открывающей кавычкой строки:
path = r"C:\Python projects\task.py"
print(path)
# Вывод: C:\Python projects\task.py
Использование необработанных строк значительно упрощает работу с длинными последовательностями специальных символов.
Однако, хотя в необработанных строках обратные слэши считаются обычными символами, экранирование самих кавычек всё равно остаётся необходимым для того, чтобы предотвратить досрочное завершение строки.
Кодирование символов
Компьютер хранит и обрабатывает информацию в виде чисел 0 и 1, поэтому каждому символу соответствует определённая числовая последовательность. Например, заглавная английская буква A
может выглядеть как 01000001
.
Процесс преобразования символов в числовые коды и обратно называется их кодированием.
Если каждый символ представляет собой последовательность из 8 бит (чисел 0 и 1), то такая система позволит представить до 28 = 256 различных символов. Однако этого может быть недостаточно для некоторых языков, ведь только в китайском языке тысячи иероглифов.
Исторически существовало множество различных кодировок, каждая из которых поддерживала определенный набор символов (например, ASCII для английского языка или КОИ-8 для кириллицы). Но это вызывало трудности при передаче текста между разными языками и платформами, так как без нужной кодировки текст был нечитаемым.
Современные системы используют универсальный стандарт для кодирования практически всех существующих символов, включая кириллицу и даже эмодзи – Юникод (англ. – Unicode). Каждому символу в Юникоде сопоставляется определенное шестнадцатеричное значение с префиксом U+
. Например, значение U+1F60A
соответствует эмодзи 😊, а U+0410
– заглавной русской букве А
.
Python позволяет напрямую встраивать символы Юникода:
print("\u041f\u0440\u0438\u0432\u0435\u0442!")
# Вывод: Привет!
Кодировка UTF-8
Стандарт Юникод решает проблему совместимости разных кодировок благодаря единому набору символов, однако для фактического хранения символов в памяти компьютера нужен метод их представления в двоичной форме. Самым распространённым способом кодирования символов Юникода является использование кодировки UTF-8
(от англ. Unicode Transformation Format, 8-bit – формат преобразования Юникода, 8-бит).
UTF-8 обладает рядом преимуществ, включая совместимость с ASCII (первые 128 символов Unicode соответствуют ASCII), а также возможность кодирования любых символов Юникода с использованием от 1 до 4 байт. Так для кодирования латинских символов достаточно одного байта (или 8 бит) – английская буква A
(U+0041
) кодируется как 01000001
, однако кириллические буквы требуют двух байт – русская буква А
( U+0410
) кодируется как 11010000 10010000
.
Благодаря этим особенностям UTF-8 стал кодировкой по умолчанию в большинстве операционных систем и программ, включая Python 3.
Функции для работы с кодированием символов
Python предоставляет встроенные инструменты для взаимодействия с внутренними представлениями символов. Основные из них – функции
и ord()
. chr()
Функция ord()
возвращает числовой эквивалент заданного символа в Юникоде, в то время как функция chr()
делает противоположное и получает символ по указанному числу.
Функция | ord(x) |
Описание | Возвращает номер символа x в Юникоде |
Параметры | x – строка, представляющая собой один символ |
Возвращаемое значение | Целое число |
Функция | chr(n) |
Описание | Возвращает символ в Юникоде по номеру n |
Параметры | n – порядковый номер символа в Юникоде |
Возвращаемое значение | Строка |
Например, получим порядковые номера некоторых символов:
print(ord("a"))
# Вывод: 97
print(ord("1"))
# Вывод: 49
А теперь по полученным порядковым номерам символов вернём сами символы:
print(chr(97))
# Вывод: a
print(chr(49))
# Вывод: 1
1. Что делает управляющий символ \n
?
2 Выведите на экран следующую строку:
Величина Единица
Сила света кандела
Сила тока ампер
3. Выведите на экран следующие строки:
C:\Program files\browser\test
A:\necessary files\timetable
D:\reading\bulgakov
4. Что такое Юникод?
5. Чем отличаются функции ord()
и chr()
?