Перейти к содержимому

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

Режим кодирования определяет, как данные упаковываются в байты QR-матрицы. Стандарт ISO 18004 описывает четыре режима — Numeric, Alphanumeric, Byte и Kanji, — каждый из которых по-своему эффективен для своего набора символов. От выбора режима зависит итоговая ёмкость кода и размер матрицы.

Режим кодирования — это способ упаковки данных внутри QR-матрицы. Стандарт ISO 18004 определяет четыре режима; правильный выбор напрямую влияет на то, сколько символов войдёт в код и насколько плотной получится матрица. Генератор определяет режим автоматически — но понимать логику полезно, чтобы осознанно контролировать длину данных.

Четыре режима и их ёмкость

Numeric — самый компактный. Работает только с цифрами 0–9. Группирует три цифры в 10 бит, что даёт вместимость до 7089 цифровых символов на версии 40 с минимальной коррекцией ошибок (L). Используется для IMEI, штрихкодов EAN, идентификаторов посылок.

Alphanumeric охватывает цифры, заглавные латинские буквы (A–Z) и девять спецсимволов: пробел, $, %, *, +, -, ., /, :. Пары символов кодируются в 11 бит; максимум — 4296 символов. В этом режиме работают многие укороченные URL-генераторы: домен QRCODE.WEBSITE/R/X7K2 умещается компактнее, чем в Byte.

Byte (Binary) кодирует каждый символ как восемь бит по ISO-8859-1, а на практике большинство генераторов передают UTF-8. Сюда попадают строчные буквы, кириллица, китайские иероглифы, символы URL (?, =, &, #) и любые другие байты. Максимум — 2953 байта. Кириллический символ в UTF-8 занимает два байта, поэтому русскоязычный URL кодируется вдвое хуже, чем латинский той же длины.

Kanji создан для японских иероглифов Shift_JIS: каждый знак пакуется в 13 бит вместо 16. Максимум — 1817 иероглифов. За пределами японского ПО режим практически не встречается.

Влияние режима на ёмкость и размер матрицы

Режим — первое, что определяет объём данных в коде. Например, телефонный номер +79161234567 (12 символов) в режиме Numeric (символы без +) потребует иного разбора, чем строка с +, которая уже перейдёт в Alphanumeric. Разница — несколько десятков бит, что на коротких данных не критично, но на длинных строках накапливается.

Более наглядный пример — URL с кириллическим хостом или поисковым запросом. Строка https://qrcode.website/glossary (34 символа) целиком уходит в Byte, но остаётся короткой. Та же ссылка с параметром ?q=режимы добавляет кириллицу в percent-encoding: %D1%80%D0%B5... — длина URL резко растёт. Это вторая причина, по которой сокращатели ссылок работают через исключительно ASCII-короткий псевдоним.

Правило простое: чем компактнее режим, тем меньше версия матрицы, тем крупнее можно напечатать код на той же площади или тем устойчивее он будет к повреждениям при данном уровне коррекции.

Автовыбор режима в генераторе

Современные генераторы, включая конструктор QRcode.website, анализируют входную строку посимвольно и выбирают наиболее компактный применимый режим. Если вся строка — цифры, применяется Numeric; если цифры плюс заглавная латиница — Alphanumeric; при наличии любого другого символа — Byte/UTF-8.

Более продвинутые реализации допускают смешанные сегменты: длинный цифровой блок внутри иначе байтовой строки может быть закодирован переключением на Numeric и обратно. Это добавляет несколько байт на служебные заголовки сегментов, поэтому переключение оправдано только при цифровом блоке длиннее ~6 символов.

На практике пользователю достаточно знать одно правило: вводите данные в наиболее компактной форме. Для ссылок — без лишних параметров, для числовых идентификаторов — без пробелов и дефисов, если они необязательны.

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

Почему QR со ссылкой на кириллическом домене получается крупнее?

Кириллические домены (IDN) в URL записываются либо напрямую в Unicode, либо в Punycode-нотации (xn--). В первом случае символы кодируются UTF-8 в режиме Byte — каждый русский символ занимает 2 байта вместо 1. Во втором Punycode длиннее исходного слова примерно вдвое. В обоих случаях матрица оказывается плотнее, чем для эквивалентного ASCII-URL.

Может ли режим Alphanumeric закодировать строчные буквы?

Нет. Стандарт ISO 18004 ограничивает Alphanumeric заглавными A–Z. Строчная буква «a» уже требует режима Byte. Именно поэтому сокращённые ссылки в QR-кодах часто используют только заглавные буквы или цифры — чтобы гарантированно попасть в Alphanumeric и выиграть в плотности.

Что будет, если передать в генератор смешанный текст — цифры, кириллицу и латиницу?

Генератор переключится в режим Byte и закодирует всё как UTF-8. Никаких ошибок не возникнет, просто матрица будет крупнее, чем если бы данные состояли только из цифр или только из ASCII. При сканировании смартфон корректно прочитает UTF-8 и отобразит оригинальный текст.

Зачем нужен режим Kanji, если есть Byte?

Byte кодирует японский иероглиф как 3 байта (24 бита) в UTF-8. Kanji упаковывает тот же знак в 13 бит — экономия почти вдвое. Для документов с тысячами иероглифов разница существенна: ниже версия матрицы, меньше шанс ошибки. За пределами Японии режим не применяется.

Можно ли вручную задать режим кодирования?

В большинстве пользовательских генераторов — нет: режим выбирается автоматически. Ручное управление доступно только через низкоуровневые библиотеки (zxing, qrcodegen и подобные). На практике автовыбор всегда оптимален; форсировать режим имеет смысл разве что для узкоспециализированных встроенных сканеров, настроенных на конкретный формат.