QRkoder

Режимы кодирования QR

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

Что такое режимы кодирования QR

QR-код не хранит данные как единый поток байт. Стандарт ISO/IEC 18004 описывает четыре режима кодирования, каждый из которых оптимизирован под определённый алфавит символов. Перед каждым блоком данных в двоичном потоке QR стоит 4-битный индикатор режима (mode indicator), который сообщает декодеру, как читать следующий фрагмент. Один QR-код может содержать несколько блоков разных режимов — это называется сегментацией.

Смысл в том, что разные символы упаковываются с разной плотностью. Три цифры в числовом режиме занимают 10 бит. Те же три цифры в байтовом — 24 бита. Разница в 2,4 раза означает либо более компактный код, либо возможность вложить больше данных в ту же матрицу.

Четыре режима и их параметры

РежимИндикаторБит на символАлфавитМакс. символов V40+L
Numeric00013,330–97089
Alphanumeric00105,50–9, A–Z, $%*+−./: пробел (45 символов)4296
Byte01008любой байт UTF-8 / ISO-8859-12953
Kanji100013Shift JIS X 02081817

Numeric Mode (числовой) — самый эффективный. Три цифры укладываются в 10 бит: тройка даёт диапазон 0–999, для которого достаточно 2¹⁰. Остаток из двух цифр — 7 бит, одной — 4 бита. Применяется для артикулов, ID платежей, штрихкодов EAN/GTIN.

Alphanumeric Mode (буквенно-цифровой) — 45 символов: цифры, прописные латинские буквы, пробел и восемь знаков ($, %, *, +, −, ., /, :). Две соседние позиции кодируются как одно число (первая × 45 + вторая), результат упаковывается в 11 бит — 5,5 бита на символ. Это единственный режим, где URL должен быть в верхнем регистре, иначе строчные буквы (a–z) вынуждают переключиться в байтовый.

Byte Mode (байтовый) — по 8 бит на каждый символ. Принимает произвольные данные: строчные буквы, кириллицу (через UTF-8), спецсимволы, JSON, бинарные потоки. За универсальность — максимальный расход бит. Кириллический символ в UTF-8 занимает 2 байта = 16 бит вместо 8. Подробнее — в статье про байтовый режим.

Kanji Mode — специализированный режим для японской кодировки Shift JIS. Иероглиф кодируется 13 битами против 16, которые занял бы тот же символ в Byte Mode. Вне японских систем практически не встречается.

Как выбирается режим автоматически

При генерации QR-кода через динамический QR на QRkoder или через библиотеки типа ZXing и nayuki/qrcodegen анализируется каждый символ входной строки. Алгоритм проходит строку слева направо и применяет жадный выбор: если все оставшиеся символы попадают в числовой алфавит — Numeric, если в 45-символьный alphanumeric-алфавит — Alphanumeric, иначе — Byte. Kanji включается отдельно для Shift JIS.

Продвинутые реализации делают оптимальную сегментацию: одна строка разбивается на несколько блоков разных режимов. Например, URL «https://qrkoder.ru/promo123456» может содержать цифровой хвост в Numeric Mode вместо Byte — экономия 15–20 бит на каждые три цифры. Для большинства практических кодов это даёт экономию одной-двух версий матрицы.

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

Почему URL в QR-коде не идёт в Alphanumeric Mode?

Alphanumeric допускает только прописные буквы A–Z. Типичный URL содержит строчные (https://example.com/path) — это автоматически переключает режим в Byte. Можно принудительно перевести URL в верхний регистр (HTTPS://EXAMPLE.COM/PATH), alphanumeric сработает, но многие серверы чувствительны к регистру пути. Для коротких ссылок выбор режима нерелевантен: разница в размере кода незначительна.

Что такое 4-битный индикатор режима?

Первые четыре бита каждого сегмента данных в QR-коде — это mode indicator: 0001 = Numeric, 0010 = Alphanumeric, 0100 = Byte, 1000 = Kanji. После индикатора идёт счётчик длины (8–16 бит в зависимости от версии QR), затем сами данные. Если код содержит несколько сегментов, каждый начинается со своего индикатора. Завершает поток terminateur 0000.

Может ли один QR-код содержать несколько режимов?

Да, стандарт ISO/IEC 18004 прямо предусматривает сегментацию. Сначала блок Alphanumeric для «HTTPS://SITE.RU/», затем Numeric для «12345». Каждый сегмент имеет свой mode indicator и счётчик длины. Такая оптимизация поддерживается в nayuki/qrcodegen, ZXing core 3.5+, qrencode 4+. Простые онлайн-генераторы кодируют всё одним сегментом Byte — результат валидный, но код на одну-две версии крупнее.

Kanji Mode работает только с японским?

Именно. Режим рассчитан исключительно на Shift JIS X 0208 — японскую кодировку. Китайские иероглифы в той же кодировке не входят, кириллица — тем более. Для любого не-японского текста Kanji Mode бесполезен: данные всё равно пойдут через Byte Mode с UTF-8.

Как режим влияет на сканируемость кода?

Напрямую не влияет. Режим определяет, сколько модулей займут данные, а значит — версию матрицы и её размер. Более компактный режим → меньше версия → меньше матрица → проще сканировать камерой. Числовой код на 40 цифр уложится в версию 1 (21×21), тот же текст в Byte займёт версию 2 (25×25). На практике разница в сканируемости заметна только на очень маленьких кодах.

Почему генератор выбрал Byte, хотя строка из цифр?

Вероятнее всего в строке есть невидимые символы: пробел, перенос строки \n, BOM. Сделайте trim перед генерацией. Второй вариант — генератор не реализует Optimal Mode Switching и всегда выбирает Byte как самый совместимый. В этом случае стоит переключиться на библиотеку с полноценным режимным анализом.

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

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

Начать бесплатно
Режимы кодирования QR-кода | Глоссарий QRkoder