Что такое QR-код: как устроен и как создать

QR-код: правильное произношение, описание и использование Полезное

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-код? Сам код — это просто данные, вредить он не может, но зашитая в него ссылка способна вести на фишинговый сайт. Поэтому перед переходом стоит посмотреть, какой адрес показал сканер, и не вводить платёжные данные на подозрительных страницах.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)