Python: уроки, справочник и задачи

Python chr(): как получить символ по его коду

Раздел: Строки в Python · Обновлено 31.10.2026

Функция chr() в Python принимает целое число и возвращает строку из одного символа, чей номер в таблице Unicode равен этому числу. Ниже разобраны допустимый диапазон, коды латиницы и кириллицы, обратная функция ord(), генерация алфавита, простой шифр и ошибки, которые возникают при неверном аргументе.

Python chr(): как получить символ по его коду
Фото: MarcoToa1 / CC0, Wikimedia Commons
Содержание статьи
  1. Синтаксис и допустимые значения
  2. Коды часто нужных символов
  3. Пара chr() и ord()
  4. Генерация алфавита
  5. Шифр Цезаря на chr() и ord()
  6. Ошибки при вызове chr()
  7. chr() или escape-последовательность
  8. Частые вопросы
    1. Чем chr() отличается от ord()?
    2. Как получить символ по коду ASCII?
    3. Как вывести все символы в диапазоне кодов?
    4. Почему chr() возвращает квадратик вместо символа?

Синтаксис и допустимые значения

У функции один обязательный аргумент - целое число, номер символа (кодовая точка Unicode). Результат всегда строка длиной 1.

chr(i)

print(chr(97))    # a
print(chr(65))    # A
print(chr(1200))  # Ұ (казахская буква)
print(chr(8364))  # €

Допустимый диапазон от 0 до 1 114 111 включительно, в шестнадцатеричной записи от 0x0 до 0x10FFFF. Это весь кодовый простор Unicode, поэтому chr() умеет вернуть любой символ: латинскую или греческую букву, иероглиф, математический знак, эмодзи. Число можно записывать в любой системе счисления, например chr(0x41) тоже вернет 'A'.

Первые 128 кодов совпадают с таблицей ASCII. Числа от 0 до 31 и 127 соответствуют управляющим символам, которые не печатаются, например chr(10) - перевод строки '\n', chr(9) - табуляция.

Коды часто нужных символов

Держать в голове всю таблицу не нужно, но несколько опорных значений помогают быстро писать и проверять код.

СимволыКодыШестнадцатеричные
цифры 0-948-570x30-0x39
латиница A-Z65-900x41-0x5A
латиница a-z97-1220x61-0x7A
кириллица А-Я1040-10710x410-0x42F
кириллица а-я1072-11030x430-0x44F
Ё и ё1025 и 11050x401 и 0x451
пробел320x20

Обратите внимание на строки с буквой ё: она лежит отдельно от основного блока кириллицы. Это частая причина ошибок в программах, которые перебирают русский алфавит по кодам. Разница между строчной и заглавной латинской буквой ровно 32, а у основной кириллицы тоже 32.

Пара chr() и ord()

Функция ord() делает обратное преобразование: принимает строку из одного символа и возвращает его код. Вместе они позволяют выполнять арифметику над символами.

print(ord('А'))         # 1040
print(chr(ord('А')))    # А

print(chr(ord('a') + 1))   # b - следующая буква
print(chr(ord('a') - 32))  # A - заглавная через сдвиг кода
print(ord('7') - ord('0')) # 7 - цифра из символа

Преобразование регистра сдвигом кода годится для учебных задач, но в реальном коде используют методы upper() и lower(): они правильно обрабатывают букву ё и символы других языков. Подробнее о методах строк читайте в разделе работа со строками.

Генерация алфавита

С помощью chr() и range() алфавит получается одной строкой. Для латиницы проще взять готовые константы string.ascii_lowercase и string.ascii_uppercase, а для кириллицы готовой константы нет.

ru = ''.join(chr(c) for c in range(ord('а'), ord('я') + 1))
print(ru)       # абвгдежзийклмнопрстуфхцчшщъыьэюя
print(len(ru))  # 32: без буквы ё

ru_full = ru[:6] + 'ё' + ru[6:]
print(len(ru_full))  # 33

Так как ё не входит в диапазон, ее приходится вставлять вручную после буквы е. Без этого шага программа проверки слов или подсчета букв будет терять все слова с ё.

Шифр Цезаря на chr() и ord()

Классическая учебная задача: сдвинуть каждую букву на k позиций по алфавиту, а после z продолжить с начала. Номер буквы в алфавите получают вычитанием кода первой буквы, сдвиг по кругу делает остаток от деления.

def caesar(text, k):
    result = []
    for ch in text:
        if 'a' <= ch <= 'z':
            pos = (ord(ch) - ord('a') + k) % 26
            result.append(chr(pos + ord('a')))
        else:
            result.append(ch)
    return ''.join(result)

secret = caesar('hello, world', 3)
print(secret)               # khoor, zruog
print(caesar(secret, -3))   # hello, world

Знаки препинания и пробелы проходят без изменений. Для расшифровки достаточно вызвать функцию с отрицательным сдвигом. Похожие упражнения собраны в разделе задачи на строки.

Ошибки при вызове chr()

Функция строго проверяет аргумент, и неправильный вызов сразу заканчивается исключением.

Еще одна частая проблема не связана с самой функцией: символ создается без ошибок, но при выводе в консоль Windows с кодировкой cp1251 появляется UnicodeEncodeError. Помогает запуск с переменной окружения PYTHONIOENCODING=utf-8 или режим UTF-8 (python -X utf8). Причины таких ошибок разбирает статья о кодировке строк.

chr() или escape-последовательность

Если код символа известен заранее, его можно записать прямо в строковом литерале. Функция chr() нужна тогда, когда код вычисляется во время работы программы.

print('\u0041')            # A, четыре hex-цифры
print('\U0001F600' == chr(0x1F600))  # True
print('\N{EURO SIGN}')     # €, по имени символа
print(chr(0x2116))         # №

Шестнадцатеричную запись кода для escape-последовательности удобно получить функцией hex(): hex(ord('№')) вернет '0x2116'. Полное описание функции есть в документации Python.

Частые вопросы

Короткие ответы на вопросы о функции chr().

Чем chr() отличается от ord()?

chr() превращает число в символ, ord() превращает символ в число. Они взаимно обратны: chr(ord(c)) == c для любого символа.

Как получить символ по коду ASCII?

Так же, через chr(): коды ASCII от 0 до 127 совпадают с первыми кодами Unicode. Отдельной функции для ASCII в Python 3 нет, а функция unichr() осталась только во второй версии языка.

Как вывести все символы в диапазоне кодов?

Переберите диапазон и соберите строку: ''.join(chr(i) for i in range(start, end + 1)). Для управляющих кодов ниже 32 удобнее выводить repr(chr(i)), иначе они не будут видны.

Почему chr() возвращает квадратик вместо символа?

Python вернул правильный символ, но шрифт консоли или редактора не содержит его изображения. Проверьте результат через ord() или выведите его в программе с другим шрифтом.