Режим Alphanumeric (Alphanumeric Mode)
Режим кодирования QR-кода для 45 символов: A–Z, 0–9 и спецсимволы. Компактнее байтового: пара символов упаковывается в 11 бит вместо 16. Используется для URL в верхнем регистре, серийных номеров, ваучеров.
Определение
Alphanumeric Mode — один из четырёх базовых режимов кодирования данных в QR-коде по стандарту ISO/IEC 18004. Режим поддерживает ровно 45 символов и упаковывает каждую пару в 11 бит. В потоке QR-кода режим помечается индикатором 0010, после которого идёт счётчик длины и сами данные блоками по два символа.
По компактности Alphanumeric занимает промежуточное место между числовым режимом (10 бит на 3 цифры, ~3,33 бит/символ) и байтовым (8 бит на символ). При 5,5 бит на символ он на 31% эффективнее Byte Mode для совместимых данных.
Алфавит и упаковка битов
Допустимые символы — строго фиксированный набор из 45 позиций:
- Цифры:
0–9 - Буквы:
A–Z(только заглавные, строчные недопустимы) - Спецсимволы: пробел,
$,%,*,+,-,.,/,:
Каждому символу присвоен порядковый номер от 0 до 44. Пара символов кодируется формулой: первый × 45 + второй — результат умещается в диапазон 0–2024 и требует ровно 11 бит (2¹¹ = 2048). Если строка нечётной длины, последний одиночный символ кодируется 6 битами.
Пример: пара AC → A=10, C=12 → 10 × 45 + 12 = 462 → 11 бит 00111001110. В Byte Mode те же два символа заняли бы 16 бит.
| Режим | Бит на символ | Алфавит |
|---|---|---|
| Numeric | 3,33 | 0–9 |
| Alphanumeric | 5,5 | A–Z, 0–9, 9 спецсимволов |
| Byte | 8 | любой байт UTF-8 |
| Kanji | 13 | Shift JIS X 0208 |
Ёмкость при уровне коррекции ошибок L:
| Версия | Размер | ECC L | ECC M | ECC Q | ECC H |
|---|---|---|---|---|---|
| 1 | 21×21 | 25 | 20 | 16 | 10 |
| 5 | 37×37 | 154 | 122 | 87 | 67 |
| 10 | 57×57 | 395 | 311 | 221 | 171 |
| 20 | 97×97 | 1249 | 969 | 691 | 545 |
| 40 | 177×177 | 4296 | 3391 | 2420 | 1852 |
Когда использовать
Alphanumeric Mode срабатывает, когда данные состоят исключительно из допустимого алфавита. Типичные случаи:
- URL в верхнем регистре —
HTTPS://EXAMPLE.COM/PROMO. Такой формат редко встречается на практике: современные серверы принимают caps-ссылки, но это нишевый сценарий для печатных материалов с короткими заглавными путями. - Серийные номера и артикулы — формат
SN-A4X92ZилиPART/00441без строчных букв укладывается в Alphanumeric и даёт код версией ниже, чем в Byte Mode. - Коды бронирований и ваучеров — авиабилеты, купоны, подарочные карты. Коды бронирований Amadeus и Sabre традиционно используют заглавные латинские буквы и цифры — стандарт де-факто для отрасли с 1970-х.
- Складские этикетки с смешанным форматом — если строка содержит и буквы, и цифры, и только эти 9 спецсимволов, Alphanumeric выгоднее байтового.
Если в данных появляется хотя бы один символ вне алфавита — строчная буква, кириллица, @, =, &, # — режим автоматически переключается на Byte Mode. Большинство реальных URL содержат строчные буквы или ? и = в параметрах, поэтому для произвольных ссылок используется байтовый режим. QRkoder и библиотеки ZXing, qrencode выбирают Alphanumeric автоматически, ручной выбор не нужен.
Выигрыш относителен длины данных. Для строки из 50 символов Alphanumeric экономит около 125 бит по сравнению с Byte Mode — достаточно, чтобы снизить версию кода на одну ступень и получить матрицу меньшего размера. На коротких строках (до 20 символов) разница незаметна. Подробнее о том, как размер данных влияет на матрицу — в статье про ёмкость QR-кода.
Частые вопросы
Почему алфавит ровно 45 символов, а не 52 или 64?
Стандарт ISO/IEC 18004 выбрал набор из 45 символов, потому что 45 × 45 = 2025 — это чуть меньше 2048 (2¹¹). Пара символов упаковывается в 11 бит с минимальным запасом. Добавь ещё хотя бы один символ — потребовалось бы 12 бит на пару, плотность упала бы. Алфавит спроектирован именно под эту арифметику: ASCII-буквы в верхнем регистре + цифры дают 36 позиций, оставшиеся 9 заняли наиболее распространённые технические символы.
Почему в алфавите нет строчных букв?
Строчные буквы ASCII расположены в диапазоне 97–122, а заглавные — 65–90. Добавить строчные означало бы расширить алфавит до 71 символа, а 71 × 71 = 5041, что не укладывается в 12 бит (4096). Режим пришлось бы переработать. На момент публикации первого стандарта QR в 1994 году большинство промышленных применений (серийники, складские коды, авиабилеты) оперировало заглавными буквами — такой алфавит был достаточным.
Можно ли использовать Alphanumeric для Wi-Fi QR-кода?
Только если SSID и пароль состоят строго из заглавных букв, цифр и девяти допустимых спецсимволов. На практике Wi-Fi пароли почти всегда содержат строчные буквы или символы вроде @, !, # — и весь QR переходит в Byte Mode. Формат Wi-Fi MECARD также включает поля с двоеточием и точкой с запятой: первое входит в алфавит, второе — нет. Генератор определяет режим автоматически, вручную указывать его не нужно.
Как генератор решает, применять Alphanumeric или Byte Mode?
Генератор анализирует каждый символ строки. Если все символы входят в набор из 45 позиций — выбирается Alphanumeric. При первом же несовместимом символе (строчная буква, кириллица, &, =, ?) происходит откат к Byte Mode для всего сегмента. Продвинутые библиотеки поддерживают смешанные сегменты: числовые фрагменты в Numeric, заглавные блоки в Alphanumeric, остальное в Byte — это даёт максимальную компактность, но ZXing и qrencode делают это автоматически.
Как убедиться, что мой QR использует Alphanumeric, а не Byte?
Проверьте входные данные: убедитесь, что нет строчных букв, кириллицы и символов вне набора 0–9 A–Z $ % * + - . / : (плюс пробел). Если хочется верифицировать итоговый код — инструменты ZXing Decoder Online или zbar показывают режим кодирования в метаданных. Также можно сравнить размер версии: одна и та же строка в Alphanumeric должна дать версию на 1–2 ступени ниже, чем в Byte Mode.