Числовой режим (Numeric Mode)
Самый компактный режим кодирования QR-кода — только цифры 0–9. Использует 10 бит на 3 цифры по ISO/IEC 18004, даёт максимальную ёмкость до 7089 цифр при версии 40.
Определение числового режима
Числовой режим (Numeric Mode) — один из четырёх режимов кодирования QR-кода по ISO/IEC 18004. Алфавит — только 0–9, никаких пробелов, точек, дефисов и букв. Взамен ограничения режим даёт самую плотную упаковку: 10 бит кодируют сразу 3 цифры. В заголовке Numeric помечается индикатором 0001, далее идёт счётчик длины (10–14 бит в зависимости от версии) и сам поток данных тройками.
Упаковка 10 бит на 3 цифры
Тройка цифр представляет число 0–999, для которого нужно ровно 10 бит (2¹⁰ = 1024). Если общее количество цифр не кратно трём, остаток в 1 цифру кодируется 4 битами, в 2 цифры — 7 битами. Сравнение с другими режимами:
| Режим | Бит на символ | Алфавит |
|---|---|---|
| Numeric | 3,33 | 0–9 |
| Alphanumeric | 5,5 | 0–9, A–Z, $%*+−./: пробел |
| Byte | 8 | любой байт UTF-8 / ISO-8859-1 |
| Kanji | 13 | Shift JIS X 0208 |
Numeric в 2,4 раза экономнее байтового режима: 100 цифр — 334 бита против 800. Конкретные значения ёмкости: V1+L = 41 цифра (хватает на ИНН), V5+L = 255 цифр, V40+L = 7089 цифр — это абсолютный потолок ёмкости QR в любом режиме.
Где применяется Numeric Mode
В большинстве реальных QR содержится URL — там работает Byte Mode. Чисто числовые задачи встречаются реже, но регулярно: числовая часть GTIN/EAN-13 (60 бит вместо 104), ID платежа в СБП-QR, артикулы и серийные номера на складских этикетках, чековые PIN и купоны.
Ручной выбор режима не нужен. QRkoder и движки ZXing, qrencode, libqrencode анализируют входную строку и автоматически переключаются: чистые цифры идут в Numeric, смешанные строки разбиваются на блоки и кодируются каждым своим режимом. На длинных числовых хвостах URL оптимизатор экономит 15–25% бит относительно сплошного Byte.
Частые вопросы
Почему 10 бит на 3 цифры?
Тройка цифр даёт диапазон 0–999, который требует ровно 10 бит (2¹⁰ = 1024). Четвёрка дала бы 0–9999 и потребовала 14 бит — 3,5 бита на символ против 3,33 при тройках. Стандарт ISO/IEC 18004 выбрал тройки как оптимум плотности.
Можно ли закодировать номер с плюсом и скобками?
Нет, Numeric принимает только 0–9. Знаки «+», скобки, дефисы переключат строку в Byte. Очистите номер до чистых цифр (79991234567 вместо +7 (999) 123-45-67) — это даст выигрыш в одну-две версии QR.
Почему QR с цифрами всё равно идёт в Byte?
Скорее всего, в строке есть невидимые символы: \n, BOM, пробелы. Сделайте trim перед генерацией. Также убедитесь, что библиотека поддерживает Optimal Mode Switching — старые реализации кодируют всё в Byte подряд. Современные движки (QRkoder, ZXing 3.5+, qrencode 4+) переключаются сами.
Сколько цифр в QR версии 1?
V1 (21×21) при ECC L вмещает 41 цифру, M — 34, Q — 27, H — 17. Этого хватает на ИНН (10–12 знаков), короткий номер заказа или PIN. Для трекинговых номеров удобнее V2–V3 с запасом до 77–127 цифр.
Используется ли Numeric в СБП-QR?
СБП-QR построен по EMVCo TLV — строка с тегами и значениями. Большая часть полей цифровая: ID получателя, сумма, BIC, MCC. Оптимизатор кодирует числовые блоки в Numeric, текстовые (название магазина, комментарий) — в Byte. За счёт этого платёжный QR умещается в V6–V10 вместо V10–V14 — критично для печати на чеке.