QR-коды давно стали привычным способом быстро передать ссылку или зашифровать короткий текст. Но вы когда-нибудь замечали, что два QR-кода, ведущие на одинаковый адрес, могут иметь разные размеры (количество «квадратиков» в матрице)? А ведь единственное отличие — это использование заглавных букв вместо строчных! Почему так происходит и в чём тут техническая хитрость?
В своём блоге Теренс Эден (Terence Eden) рассказывает, как именно спецификация QR-кодов экономит место при использовании «режима кодирования символов и чисел - Alphanumeric Mode», который поддерживает только ограниченный набор символов (включая A-Z и некоторые знаки препинания), но не включает строчные буквы.
🔬 Немного «бинарной» магии
🤖 Устройство QR-кода: Внутри есть несколько режимов кодирования, и один из них (Alphanumeric Mode) предназначен для набора из 45 символов (A-Z, цифры 0-9 и ограниченный набор спецсимволов). Если ваши данные умещаются в этот поднабор, то QR-код сможет «упаковать» информацию более эффективно — по сути, пара символов записывается в 11 бит, что чуть компактнее, чем режим байтового кодирования (Byte Mode) - 8 бит на символ.
😎 Когда URL целиком в верхнем регистре (например, HTTPS://EDENT.TEL/), QR-код переходит в режим кодирования символов и чисел. Это позволяет ему «сократить» общую длину кодируемого блока и уместиться в «меньший» формат (версия QR может быть 1, 2 и т.д., соответственно размер матрицы 21×21, 25×25 и т.д.).
😵 Почему же строчные буквы делают сокращение менее эффективным? Потому что https://edent.tel/ уже не подходит под разрешённый набор символов в режиме кодирования символов и чисел, следовательно, кодировщик переходит в режим байтового кодирования. А там для каждого байта приходится резервировать 8 бит — получаем больше информации, значит более «крупный» QR код.
⚙️ Технические подробности
🔎 Индикатор режима (Mode Indicator) в QR-кодах занимает первые 4 бита. Когда он равен 0010 (в двоичном формате), это значит режим кодирования символов и чисел. Если он 0100 — это режим байтового кодирования. После этого QR-декодер читает «количество символов» (length), но дальше формат пакуется по разным правилам.
🖥️ Сами данные:
- Режим кодирования символов и чисел: 45 возможных символов, пара символов в 11 битах.
- Режим байтового кодирования: любой байтовый символ (ASCII и не только), каждый символ занимает 8 бит.
URL, состоящий из одних заглавных букв и ограниченных спецсимволов (:, /, - и т.д.), автоматически даст более эффективную упаковку.
💡 Личный взгляд и практические советы
🎨 Если вы делаете QR-код для печати — на визитках, плакатах, упаковке — старайтесь использовать вариант с заглавными буквами (например, HTTPS://MYCOOLAPP.COM/) и убирайте ненужные параметры. Таким образом, можно уменьшить физический размер QR-кода или повысить его избыточность (уровень коррекции ошибок), улучшив тем самым сканирование.
🥳 Но учтите: не все URL готовы работать в разных регистрах. У большинства веб-серверов регистр домена не играет роли (DNS нечувствителен к регистру), а вот для путей или параметров в GET-запросе (после /?q=...) некоторые сервера могут различать регистры. Так что нужно проверить, действительно ли ваш сайт одинаково понимает MYDOMAIN.COM/PAGE и mydomain.com/page.
🔧 В продвинутых случаях: есть ещё хитрости, например сокращать URL через редирект, чтобы сам QR-код стал меньше, или использовать дополнительную мини-оптимизацию (выбирать нужный уровень коррекции ошибок в зависимости от условий печати).
🖇️ Ссылки по теме:
Можно проверить, как ваш текст распаковывается побайтно или помодульно.
🏁 Итого
Если хотите максимально компактный и легко сканируемый QR-код, используйте заглавные буквы и спецсимволы из ограниченного набора режима кодирования символов и чисел. Это, возможно, выглядит «громоздко» с точки зрения текста, но зато даёт меньше «квадратиков» в итоговой матрице. QR-коды — это не просто чёрно-белые точки, а настоящий миниатюрный «закодированный» мир со своими правилами оптимизации!