QRkoder

Смешанный режим кодирования QR

Смешанный режим — запись данных в QR-код несколькими сегментами разных режимов (numeric, alphanumeric, byte) вместо одного. Экономит биты и позволяет уложиться в меньшую версию символа.

Что такое смешанный режим

Смешанный режим кодирования — запись содержимого QR-кода не одним куском, а несколькими сегментами, каждый из которых использует свой режим: числовой, буквенно-цифровой, байтовый или кандзи. Стандарт ISO/IEC 18004 разрешает это прямо: сегменты идут подряд, декодер читает их по очереди и склеивает результат в одну строку.

Зачем городить огород? Затем, что режимы упаковывают символы с разной плотностью. Цифра в числовом режиме стоит 3,33 бита, в буквенно-цифровом — 5,5, в байтовом — все 8. Если строка неоднородна (буквы, потом длинный числовой хвост), запись её целиком в самый универсальный режим — это переплата битами за каждый символ. Разбор режимов по отдельности — в термине режимы кодирования QR.

Из чего состоит сегмент

Каждый сегмент начинается с двух служебных полей: четырёхбитного индикатора режима и счётчика длины. Индикаторы фиксированы — 0001 для numeric, 0010 для alphanumeric, 0100 для byte, 1000 для kanji. А вот разрядность счётчика зависит и от режима, и от версии символа:

РежимВерсии 1–9Версии 10–26Версии 27–40
Numeric10 бит12 бит14 бит
Alphanumeric9 бит11 бит13 бит
Byte8 бит16 бит16 бит
Kanji8 бит10 бит12 бит

Отсюда цена переключения. Открыть числовой сегмент в версии 1–9 стоит 4 + 10 = 14 бит. Это накладной расход, который надо отбить экономией на самих данных. Завершает поток терминатор 0000.

Сколько экономит разбиение

Возьмём строку HTTPS://EXAMPLE.RU/P/8412360075 — 31 символ, все в верхнем регистре.

  • Одним байтовым сегментом: 31 × 8 = 248 бит данных плюс 12 бит служебных. Итого 260 бит.
  • Двумя сегментами: первые 21 символ в alphanumeric — 116 бит данных плюс 13 служебных, то есть 129. Хвост из 10 цифр в numeric — 34 бита данных плюс 14 служебных, то есть 48. Итого 177 бит.

Разница — 83 бита, больше десяти байт. На границе версий такой запас роняет матрицу на ступень ниже, а значит модуль на печати становится крупнее при том же физическом размере наклейки. Про то, как объём данных связан с версией, — в термине ёмкость данных QR-кода.

Простое правило для прикидки: выносить числовой хвост из байтового сегмента выгодно начиная примерно с четырёх цифр подряд, из буквенно-цифрового — примерно с семи. Короче — переключение не окупается, служебные биты съедят выигрыш.

Как генератор выбирает разбиение

Жадный алгоритм идёт по строке слева направо и меняет режим, как только встречает символ, который в текущий не влезает. Работает быстро, результат приличный, но не лучший: жадность не видит, что через два символа придётся переключаться обратно, и переключение того не стоило.

Оптимальное разбиение ищут динамическим программированием: для каждой позиции строки считается минимальная стоимость в битах при каждом режиме, затем выбирается дешёвый путь целиком. Такой поиск реализован, например, в библиотеке nayuki/qrcodegen. Деталь, о которую спотыкаются самописные реализации: разрядность счётчиков зависит от версии, поэтому оптимальное разбиение для версии 5 и для версии 30 может отличаться.

Массовые онлайн-генераторы обычно пишут всё одним байтовым сегментом. Код валидный, читается везде, просто на одну-две версии крупнее необходимого. Заметно это там, где место дорого: гравировка на детали, наклейка на ампуле, поле в бланке. Собрать и сравнить варианты можно в генераторе QR-кодов.

Чего смешанный режим не делает

Он не увеличивает предельную ёмкость символа. Потолок задаёт версия и уровень коррекции ошибок; сегментация лишь помогает уложиться в этот потолок экономнее.

Он не имеет отношения к разбиению данных на несколько отдельных кодов — это другой механизм, структурированное присоединение, где физических символов несколько, а логическое сообщение одно. В смешанном режиме символ всегда один, разбиты внутри него только сегменты.

И он не отменяет объявления кодировки: если в строке есть кириллица, перед байтовым сегментом всё равно нужен ECI. Более того, кириллица обычно убивает саму идею экономии — русский текст целиком уходит в байтовый режим по два байта на букву, и переключать там нечего.

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

Сколько сегментов можно положить в один QR-код?

Отдельного лимита стандарт не задаёт — ограничение общее, это ёмкость версии символа. Формально чередовать режимы можно хоть на каждом символе, но служебные поля быстро съедят весь выигрыш. На практике осмысленных сегментов бывает два-три: буквенная часть URL и числовой идентификатор. Десяток переключений почти всегда означает, что алгоритм считает стоимость неправильно.

Почему мой код не стал меньше после разбиения на сегменты?

Три типичные причины. Первая — в строке есть строчные буквы: буквенно-цифровой режим знает только заглавные, и любая маленькая буква утаскивает фрагмент в байтовый. Вторая — числовые куски слишком короткие, 14 бит на открытие сегмента не отбиваются. Третья — шаг между версиями дискретный, и экономия в 20 бит просто не доходит до следующей ступеньки.

Все ли сканеры понимают смешанный режим?

Да, это базовая часть ISO/IEC 18004, а не расширение: декодер обязан читать индикатор режима перед каждым сегментом. Поддержка есть и в камерах смартфонов, и в промышленных считывателях. Проблемы возникают не при чтении, а при генерации — когда самописная реализация неверно считает разрядность счётчика длины и пишет битый поток.

Стоит ли переводить URL в верхний регистр ради экономии?

Иногда да. Схема и домен регистронезависимы, поэтому HTTPS://EXAMPLE.RU ведёт туда же, куда строчный вариант, зато попадает в буквенно-цифровой режим — 5,5 бита на символ вместо 8. А вот путь и параметры регистр различают: превратив /Promo в /PROMO, вы рискуете получить 404. Компромисс: заглавными писать только схему и домен.

Самойлов Андрей Иванович — Эксперт по QR-кодам и SaaS-маркетингу

Автор материала

Андрей Самойлов

Эксперт по QR-кодам и SaaS-маркетингу. 10 лет в SaaS, маркетинге и ИТ.

Об авторе и все материалы

Создавайте QR-коды бесплатно

Динамические QR-коды с аналитикой, дизайном и без ограничений по сканированиям.

Начать бесплатно