Numeric mode (QR)
Numeric mode — самый компактный режим кодирования QR. Упаковывает 3 цифры в 10 бит (3.33 бит/цифру). До 7089 цифр в QR-40 — максимум формата.
Что такое Numeric mode
Numeric mode — режим кодирования данных в QR-коде, предназначенный исключительно для десятичных цифр (0–9). Идентификатор режима в заголовке потока данных — 0001 в двоичном представлении. Это самый эффективный из четырёх базовых режимов стандарта ISO/IEC 18004: три цифры упаковываются всего в 10 бит, что даёт плотность 3,33 бит на символ. Для сравнения — в Byte mode один символ занимает 8 бит, то есть одна цифра обходится в 8 бит против 3,33 в числовом режиме.
Выбор режима происходит автоматически: если кодируемые данные состоят только из цифр, современный генератор QR-кодов переключается в Numeric mode без участия пользователя. Результат — код меньшего размера при том же объёме данных.
Алгоритм упаковки: 3 цифры → 10 бит
Стандарт разбивает числовую строку на группы по три символа и кодирует каждую группу отдельно:
- 3 цифры → 10 бит. Тройка от 000 до 999 кодируется как целое десятичное число от 0 до 999 включительно. Диапазон 0–999 укладывается в 10 бит (210 = 1024 > 999).
- 2 оставшиеся цифры → 7 бит. Если после разбивки остаётся пара, она кодируется как число 0–99 в 7 бит (27 = 128 > 99).
- 1 оставшаяся цифра → 4 бита. Одиночная цифра 0–9 занимает 4 бита (24 = 16 > 9).
Пример: строка «12345» разбивается на «123» (→ 10 бит) + «45» (→ 7 бит). Итого 17 бит. В Byte mode те же пять символов заняли бы 40 бит — экономия 57%. Для длинных числовых строк выгода накапливается и доходит до 25–30% по площади финального QR-кода относительно Byte mode.
Максимальная ёмкость
Numeric mode обеспечивает максимальную вместимость среди всех режимов QR-кода. В QR версии 40 с уровнем коррекции ошибок L в числовом режиме помещается 7 089 цифр — абсолютный рекорд формата. Это в 1,65 раза больше, чем в Alphanumeric mode (4 296 символов), и в 2,4 раза больше, чем в Byte mode (2 953 байта).
| Режим | Символы в QR-40 (ECC L) | Бит/символ |
|---|---|---|
| Numeric | 7 089 цифр | 3,33 |
| Alphanumeric | 4 296 знаков | 5,5 |
| Byte | 2 953 байта | 8,0 |
| Kanji | 1 817 иероглифов | 13,0 |
На практике объём редко приближается к теоретическому максимуму: серийный номер GS1 укладывается в несколько десятков цифр, а банковский реквизит — в несколько сотен. QR-код в Numeric mode для таких данных получается компактным — версии 2–7 — и надёжно считывается даже с небольшого размера.
Где применяется Numeric mode
Режим включается автоматически для любого чисто числового содержимого. Типичные сценарии:
- Серийные номера товаров. 10–20-значные артикулы в промышленной маркировке и складской логистике.
- GS1-маркировка. GTIN-8, GTIN-13, GTIN-14 — числовые коды из стандарта GS1. Numeric mode обязателен для совместимости с промышленными сканерами.
- Лотерейные и промокоды. Длинные числовые коды для верификации выигрышей или активации скидок.
- Фискальные QR-чеки. Часть данных фискального QR (номер ФН, ФД, сумма в копейках) — числовая. Если весь контент числовой, применяется Numeric mode.
- Банковские реквизиты. БИК, счёт, ИНН/КПП — строго цифровые поля в СБП-платежах могут кодироваться числовым режимом при передаче отдельных полей.
Если данные содержат хотя бы один нецифровой символ (букву, пробел, слэш), генератор автоматически переключается на Alphanumeric или Byte mode. Принудительно задать Numeric mode для смешанного содержимого нельзя — стандарт запрещает.
Частые вопросы
Чем Numeric mode отличается от Byte mode в QR-коде?
Byte mode кодирует каждый байт в 8 бит и принимает любые символы UTF-8 — буквы, спецсимволы, пробелы, Unicode. Numeric mode принимает только цифры 0–9 и упаковывает тройки символов в 10 бит вместо 24. За счёт этого числовая строка той же длины занимает примерно на 58% меньше бит. Практически это означает более компактный QR-код: при 25 цифрах Byte mode даст QR версии 2, а Numeric mode — версии 1. Если в данных есть хотя бы один нецифровой символ, Numeric mode недоступен, и генератор переходит в Byte или Alphanumeric.
Как узнать, в каком режиме закодирован QR-код?
Режим кодирования записывается в первых 4 битах потока данных после служебных областей. Значение 0001 — Numeric, 0010 — Alphanumeric, 0100 — Byte, 1000 — Kanji. Большинство пользовательских сканеров не отображают режим напрямую, но некоторые библиотеки (zxing, zbar) возвращают его в метаданных результата декодирования. В веб-инструментах для анализа QR-кодов, например в режиме отладки QRkoder, режим отображается в поле «Format». Для обычного сканирования информация о режиме не нужна — она прозрачна для конечного устройства.
Можно ли смешивать Numeric mode с другими режимами в одном QR-коде?
Да — стандарт ISO/IEC 18004 поддерживает сегментированное кодирование: одна часть строки кодируется в Numeric, другая — в Alphanumeric или Byte. Например, строка «SN:00184920» содержит буквы «SN:», которые переводят первый сегмент в Byte mode, а цифровую часть «00184920» можно отдать в Numeric. Современные оптимизирующие кодировщики (в том числе основанные на алгоритме Annex J стандарта) автоматически ищут оптимальное разбиение на сегменты, чтобы минимизировать суммарный объём бит. Ручная настройка режимов в пользовательских интерфейсах обычно не требуется.
Даёт ли Numeric mode реальный выигрыш по размеру QR-кода?
Да, измеримый. Строка из 20 цифр в Numeric mode занимает около 67 бит данных, в Byte mode — 160 бит. Разница позволяет использовать QR на 1–2 версии меньше, что сокращает физический размер примерно на 15–25%. Для печатных носителей (упаковка, бирки, чеки) это означает, что код остаётся читаемым при меньшей площади. Для промышленных этикеток, где каждый миллиметр на счету, выбор Numeric mode вместо Byte — обязательное требование, прямо прописанное в ряде GS1-спецификаций.
Почему в фискальных QR-кеках не всегда используется Numeric mode?
Фискальный QR-чек содержит как числовые поля (ФН, ФД, сумма, дата в числовом формате), так и текстовые (тип операции, адрес сайта ФНС в виде URL). Генератор переключается в Byte mode для всей строки, если данные передаются единым блоком с нецифровыми символами. Разбивка на числовые и текстовые сегменты теоретически экономит биты, но реализации кассового ПО в РФ исторически используют Byte mode для простоты — это соответствует требованиям ФНС к читаемости, хотя и не оптимально по плотности.