Байтовый режим (Byte Mode)
Режим кодирования QR-кода для произвольных бинарных данных и текста в UTF-8. Один из 4 базовых режимов ISO/IEC 18004 — самый универсальный, но менее эффективный по ёмкости.
Что такое байтовый режим QR-кода
Байтовый режим (англ. Byte Mode, иногда называют 8-bit byte mode) — один из четырёх базовых режимов кодирования данных в стандарте QR-кода ISO/IEC 18004. В этом режиме каждый символ исходных данных упаковывается в 8 бит, то есть ровно в один байт. Индикатор режима в потоке QR — четырёхбитная последовательность 0100, после которой идёт длина блока и сами данные.
Режим — самый универсальный из всех. Цифровой и буквенно-цифровой работают только с ограниченными наборами символов (0–9 и 45 ASCII-знаков соответственно), Kanji-режим — исключительно с японской кодировкой Shift JIS. Byte Mode принимает любую последовательность октетов: URL, кириллицу, спецсимволы, символы валют, полностью произвольные бинарные данные. Цена универсальности — самое затратное представление: один символ занимает целый байт, тогда как цифровой режим упаковывает 3 цифры в 10 бит.
Кодировка: ISO-8859-1 vs UTF-8
По умолчанию стандарт ISO/IEC 18004 предписывает интерпретировать байты в Byte Mode как ISO-8859-1 (Latin-1) — однобайтную кодировку для латиницы и базовых западноевропейских символов. На практике это работает только для английского текста. Для кириллицы, китайских иероглифов, эмодзи и любых не-латинских символов используется UTF-8, а декодеру об этом сообщается через специальный заголовок ECI 26 (Extended Channel Interpretation, индикатор кодировки 000026).
В реальности все современные генераторы и сканеры по умолчанию ставят и распознают UTF-8 — даже без явного ECI-заголовка большинство декодеров проверяют BOM или эвристики и выбирают UTF-8. Это упрощает работу с многоязычными данными, но имеет последствия для ёмкости: один кириллический символ в UTF-8 занимает 2 байта, эмодзи — 4 байта.
| Текст | Байт UTF-8 | Бит в QR |
|---|---|---|
| hello | 5 | 40 |
| привет | 12 | 96 |
| café | 5 | 40 |
| cafe ☕ | 9 | 72 |
Русское «привет» в QR-коде занимает в 2,4 раза больше места, чем английское «hello». Для большой коллекции данных на кириллице это означает более крупную версию QR-кода и более плотную матрицу.
Ёмкость байтового режима
Максимум Byte Mode — 2953 байта в QR-коде версии 40 при минимальном уровне коррекции ошибок L. Это абсолютный потолок стандарта для бинарных данных. На практике такие объёмы используются крайне редко: код версии 40 имеет матрицу 177×177 модулей и тяжело сканируется камерой смартфона.
| Версия | Размер | ECC L | ECC M | ECC Q | ECC H |
|---|---|---|---|---|---|
| 1 | 21×21 | 17 | 14 | 11 | 7 |
| 5 | 37×37 | 106 | 84 | 60 | 46 |
| 10 | 57×57 | 271 | 213 | 151 | 119 |
| 20 | 97×97 | 858 | 666 | 482 | 382 |
| 40 | 177×177 | 2953 | 2331 | 1663 | 1273 |
Для типичных задач — короткой ссылки длиной 30–50 символов или vCard с базовыми контактами — достаточно версий 3–8. Универсальный байтовый код для русского URL длиной 60 символов укладывается в версию 4–5 при ECC уровня M, размер 33×33 или 37×37 модулей.
Когда применяется Byte Mode
В подавляющем большинстве реальных QR-кодов используется именно байтовый режим. Причины простые:
- URL и короткие ссылки — содержат символы, не входящие в alphanumeric-набор: маленькие буквы,
?,=,&,#, кириллицу в путях. - Кириллический текст — обязательно идёт через UTF-8 в Byte Mode.
- vCard и MECARD — имена, должности и адреса содержат символы любого языка плюс пунктуацию.
- Wi-Fi пароли — пароли часто используют символы, не входящие в alphanumeric.
- JSON, XML, base64-данные — двоичные потоки кодируются только побайтово.
Большинство онлайн-генераторов QR, включая QRkoder, по умолчанию выбирают Byte Mode для произвольного ввода — это гарантирует, что код будет валидным независимо от содержимого. Оптимизация под цифровой или буквенно-цифровой режим включается только когда генератор автоматически определит, что весь ввод состоит исключительно из подходящих символов.
Смешанный режим и сегментация
Стандарт ISO/IEC 18004 разрешает разбивать данные на сегменты разных режимов внутри одного QR-кода. Например, ссылка «https://qrkoder.ru/promo123456789» может быть закодирована тремя сегментами: префикс «https://qrkoder.ru/promo» в Byte Mode (24 байта = 192 бита), цифры «123456789» в Numeric Mode (всего 30 бит вместо 72) и плюс служебные индикаторы режимов. Такая оптимизация даёт экономию 5–15% размера для смешанных строк и поддерживается продвинутыми библиотеками (например, nayuki/qrcodegen, ZXing core). Простые онлайн-генераторы её не делают и кодируют всё одним сегментом Byte Mode — итоговый код получается на одну версию крупнее, но абсолютно корректным и читаемым.
Связанные концепции
- Numeric Mode — 3 цифры за 10 бит, для чисел.
- Версия QR-кода — определяет максимальную ёмкость в байтах.
- Ёмкость данных — общий объём кода с учётом ECC.
- vCard — типичный кейс байтового режима.
- Kanji Mode — 13 бит на символ, только Shift JIS — не путать с Byte Mode.
Частые вопросы
Почему кириллица занимает в QR в 2 раза больше места?
Все символы кириллицы расположены в Unicode-блоке U+0400–U+04FF, который при кодировании в UTF-8 представляется двухбайтовыми последовательностями. Один символ «А» = два байта 0xD0 0x90, «р» = 0xD1 0x80. В Byte Mode каждый байт занимает 8 бит, поэтому строка из 6 кириллических букв занимает 96 бит против 40 бит для 5 латинских букв. Это особенность UTF-8, а не QR-кода. Альтернативные KOI8-R или Windows-1251 дали бы один байт на символ, но эти кодировки не поддерживаются ECI и не распознаются современными сканерами.
Какая разница между Byte Mode и Kanji Mode?
Byte Mode упаковывает любые данные по 8 бит на символ. Kanji Mode — узкоспециализированный режим для японской кодировки Shift JIS: каждый японский иероглиф представляется как 13 бит вместо 16 бит, которые занял бы тот же символ в Byte Mode через UTF-8. Это даёт компактность для японских текстов, но абсолютно бесполезно для русского, английского, китайского или любого другого языка. Все не-японские данные обязательно идут через Byte Mode.
Можно ли уменьшить размер QR с кириллическим текстом?
Стандартными средствами — нет, UTF-8 всегда занимает 2 байта на кириллический символ. Реальные пути сокращения: сократить сам текст, использовать динамический QR-код (в графику пишется короткая латинская ссылка, а текст хранится на сервере и обновляется без перепечатки), либо применять смешанный режим с сегментацией для URL, содержащих и латиницу, и цифры. Для длинного текста на русском (более 200 символов) единственное практичное решение — динамический QR с короткой ссылкой.
Что такое ECI 26 в Byte Mode?
ECI (Extended Channel Interpretation) — механизм стандарта ISO/IEC 18004 для указания кодировки в потоке QR-кода. Перед сегментом данных вставляется заголовок: 4 бита индикатора ECI 0111 и номер кодировки. Значение 26 соответствует UTF-8. Также используются ECI 1 (CP437), ECI 3 (ISO-8859-1), ECI 9 (ISO-8859-7, греческий). Современные сканеры распознают UTF-8 и без явного ECI-заголовка по эвристикам, поэтому многие генераторы его не вставляют — это экономит 12–20 бит.
Почему генератор QR всегда выбирает байтовый режим, даже для коротких чисел?
Большинство простых онлайн-генераторов запрограммированы на максимальную совместимость и не анализируют ввод. Любая строка, включая «12345», попадает в Byte Mode целиком. Это даёт чуть более крупный код, но гарантирует корректное декодирование любым сканером. Продвинутые библиотеки (nayuki/qrcodegen, ZXing core) автоматически определяют оптимальный режим: если все символы цифровые — выбирают Numeric Mode, если попадают в alphanumeric-набор — Alphanumeric Mode, иначе — Byte Mode. Для большинства практических задач разница в размере незаметна и не стоит времени на оптимизацию.