QR-код — это двумерный штрихкод в виде матрицы из чёрных и белых квадратов, которая хранит текст, ссылку или другие данные и считывается камерой смартфона за доли секунды. Название расшифровывается как Quick Response — «быстрый отклик»: формат придумали так, чтобы сканер распознавал метку мгновенно и с любой стороны. Ниже разберём, как QR-код устроен внутри, какие бывают виды, где он применяется и как создать собственный код на Python.
Содержание
Кто и зачем придумал QR-код
Первый QR-код разработала японская компания Denso Wave (в то время подразделение группы Toyota) в 1994 году; автором считается инженер Масахиро Хара. Обычный линейный штрихкод хранит порядка 20 символов, и на конвейере этого не хватало для учёта автомобильных деталей. Двумерная матрица сняла ограничение: она вмещает в сотни раз больше данных и читается в любой ориентации, а не только строго слева направо. Позже формат закрепили как международный стандарт ISO/IEC 18004, а сама Denso Wave не стала требовать лицензионных отчислений за использование кода — поэтому сегодня существует столько бесплатных генераторов и сканеров.
Как устроен QR-код
Внутри чёрно-белого квадрата не случайный узор, а строгая структура. Основные части:
- Поисковые узоры — три крупных квадрата в углах. По ним сканер находит код в кадре и понимает его поворот.
- Выравнивающие узоры — мелкие квадраты внутри, которые компенсируют наклон и искажение камеры.
- Синхронизирующие линии — чередование чёрных и белых модулей, задающее сетку.
- Служебные зоны — хранят версию кода и уровень коррекции ошибок.
- Область данных — собственно закодированная информация вместе с добавленными байтами для восстановления.
Размер QR-кода измеряется в модулях (клетках), а не в пикселях или сантиметрах. Версия 1 — это сетка 21×21 модуль; каждая следующая версия добавляет по 4 модуля на сторону. Максимальная версия 40 — это уже сетка 177×177 модулей и несколько тысяч символов данных. Чем больше данных, тем крупнее и «плотнее» получается код, поэтому длинную ссылку часто сокращают перед кодированием.
Сколько данных влезает и режимы кодирования
Чтобы не тратить место впустую, QR-код подбирает режим кодирования под тип данных. Один и тот же квадрат вместит заметно больше цифр, чем произвольного текста:
| Режим | Что кодирует | Максимум символов (версия 40, уровень L) |
|---|---|---|
| Числовой | только цифры 0-9 | 7089 |
| Буквенно-цифровой | цифры, латиница A-Z, пробел и знаки $ % * + — . / : | 4296 |
| Байтовый | любые байты; по умолчанию Latin-1, для кириллицы и эмодзи — UTF-8 | 2953 |
| Кандзи | японские иероглифы в кодировке Shift-JIS | 1817 |
Практический вывод: если кодируете только цифры (например, номер платежа), выбирайте числовой режим — код останется мелким. Русский текст и большинство ссылок попадают в байтовый режим, поэтому кириллица «весит» больше латиницы: каждый символ в UTF-8 занимает 2 байта вместо одного.
Коррекция ошибок: почему код читается даже поцарапанным
QR-код продолжает считываться, даже если часть узора закрыта логотипом, заляпана или порвана. За это отвечает избыточность: помимо самих данных в код добавляются проверочные байты по алгоритму Рида — Соломона. Уровень избыточности выбирается при создании:
| Уровень | Восстанавливает до | Когда выбирать |
|---|---|---|
| L (Low) | ~7% | чистая печать или экран, где код не повредится |
| M (Medium) | ~15% | универсальный вариант по умолчанию |
| Q (Quartile) | ~25% | наклейки в проходном месте, лёгкое загрязнение |
| H (High) | ~30% | логотип в центре кода, уличные условия |
Отсюда правило: логотип поверх кода допустим только при уровне Q или H, иначе он «съест» слишком много данных и код перестанет читаться. Платой за надёжность становится размер — чем выше уровень, тем крупнее матрица при том же тексте.
Виды QR-кодов
Коды удобно делить по двум признакам. Первый — по возможности редактирования:
- Статические. Данные вшиты в сам узор. Такой код бесплатно создаётся за секунды, но изменить его содержимое после печати нельзя — только перегенерировать новый. Подходит для большинства личных и разовых задач.
- Динамические. В сам узор зашита короткая ссылка-редирект на сервис, а конечный адрес хранится на стороне сервиса и меняется в любой момент без перепечатки кода. Полезно для рекламы и упаковки, где важна аналитика переходов; такие коды обычно платные и зависят от работы сервиса-посредника.
Второй признак — по содержимому: ссылка на сайт (самый частый случай), обычный текст, контакт-визитка (vCard), параметры подключения к Wi-Fi, геометка, реквизиты платежа. Тип данных задаётся при создании и определяет, что произойдёт после сканирования — откроется сайт, добавится контакт или подключится сеть.
Как создать QR-код
Два рабочих способа: онлайн-сервис или код.
Через онлайн-генератор достаточно выбрать тип данных (ссылка, текст, Wi-Fi), ввести содержимое, при желании задать цвет и логотип, выбрать уровень коррекции и скачать картинку в PNG или SVG. Для печати берите векторный SVG — он не размылится при увеличении.
Программно QR-код удобно генерировать на Python библиотекой qrcode. Установка — pip install qrcode[pil]. Простейший вариант в две строки:
import qrcode
img = qrcode.make("https://otus.ru")
img.save("otus.png") # создаст PNG-файл с готовым QR-кодом
Частая ошибка новичка — жёстко зафиксировать самую маленькую версию и запретить автоподбор размера. Тогда длинные данные просто не помещаются в сетку:
# Неверно: версия 1 (21x21) и запрет на автоподбор
import qrcode
qr = qrcode.QRCode(version=1)
qr.add_data("https://otus.ru/lessons/python-basic/")
qr.make(fit=False)
Фактический результат:
qrcode.exceptions.DataOverflowError: Invalid version, cannot fit data
Исправление — разрешить библиотеке самой подобрать версию под объём данных:
import qrcode
qr = qrcode.QRCode(version=None) # или просто fit=True в make()
qr.add_data("https://otus.ru/lessons/python-basic/")
qr.make(fit=True)
print(qr.version) # -> 3: библиотека увеличила сетку сама
img = qr.make_image()
img.save("course.png")
Тот же принцип работает и с уровнем коррекции: если планируете наложить логотип, задайте error_correction=qrcode.constants.ERROR_CORRECT_H при создании объекта QRCode, иначе центр кода окажется нечитаемым.
Выводы
- QR-код — это двумерный штрихкод: матрица чёрно-белых модулей, которая хранит ссылку или текст и читается камерой в любой ориентации.
- Формат придумала Denso Wave в 1994 году для учёта деталей; он описан стандартом ISO/IEC 18004 и свободен от лицензионных отчислений.
- Внутри есть строгая структура: поисковые и выравнивающие узоры, служебные зоны и область данных с проверочными байтами.
- Ёмкость зависит от режима: цифры кодируются плотнее всего, кириллица идёт в байтовом режиме и занимает по 2 байта на символ.
- Уровень коррекции L, M, Q, H задаёт запас прочности; логотип поверх кода требует уровня Q или H.
- Создать код можно в онлайн-сервисе за минуту или программно на Python:
qrcode.make(...)плюс автоподбор версии черезfit=True.
Где применяется / связь с практикой
QR-коды окружают нас повсюду: оплата по СБП, меню в кафе, посадочные на транспорт, подключение к Wi-Fi, вход в аккаунт через двухфакторную аутентификацию, ссылки на упаковке товаров. За каждым таким кодом стоит одна и та же идея — превратить данные в изображение и обратно, а этим как раз занимается программирование: разбор строк, работа с кодировками, вызов готовых библиотек.
Если хочется не только сканировать чужие коды, но и генерировать свои и вообще автоматизировать подобные задачи, начните с основ языка. На курсе «Python Basic» как раз разбирают работу со строками, файлами и внешними библиотеками вроде qrcode. А чтобы просто попробовать формат обучения и оценить темы вживую, загляните на бесплатные вебинары Otus — там разбирают конкретные задачи с преподавателями.
Смежные темы: QR-Codes от А до Я, Стандарты Юникода и другие распространённые кодировки, KOI-8 и ASCII — всё о кодировании символов.
FAQ
Как правильно произносить и писать «QR-код»? По буквам английского алфавита — «кью-ар код»; встречаются варианты «ку-ар» и «кю-ар». На письме по правилам русского языка сложные слова с иноязычной аббревиатурой и частью-словом пишутся через дефис, поэтому корректно именно «QR-код».
Истекает ли срок действия у QR-кода? У статического кода — нет: пока цела картинка и жив адрес, на который он ведёт, код будет работать хоть через годы. У динамического кода переход может перестать открываться, если владелец не продлил подписку на сервис-посредник или удалил ссылку-редирект.
Опасно ли сканировать чужой QR-код? Сам код — это просто данные, вредить он не может, но зашитая в него ссылка способна вести на фишинговый сайт. Поэтому перед переходом стоит посмотреть, какой адрес показал сканер, и не вводить платёжные данные на подозрительных страницах.



