QRkoder

UTF-8 в QR-коде

UTF-8 в QR-коде — поддержка многоязычных символов (включая кириллицу) через расширение ECI 26. Обязательно для русских текстов, иначе сканеры показывают «кракозябры».

Определение UTF-8 в QR-коде

UTF-8 — это кодировка символов Unicode, которая покрывает все языки мира: кириллицу, арабский, китайские иероглифы, эмодзи и тысячи других символов. В контексте QR-кода UTF-8 решает конкретную задачу — позволяет закодировать русский текст так, чтобы сканер на любом устройстве отобразил его правильно, а не в виде нечитаемой каши символов.

Стандарт ISO/IEC 18004 изначально проектировался под западноевропейские языки: базовый Byte-режим поддерживает только Latin-1 (ISO 8859-1), то есть латиницу и простые диакритические знаки. Русского алфавита в Latin-1 нет. Чтобы обойти это ограничение, в стандарт включили механизм ECI — расширенную интерпретацию каналов.

ECI 26 — расширение для UTF-8

ECI (Extended Channel Interpretation) — это служебный механизм ISO/IEC 18004, позволяющий явно указать кодировку данных внутри QR-символа. Каждая кодировка получает числовой идентификатор: Latin-1 — это ECI 3, Shift JIS — ECI 20, а UTF-8 — ECI 26.

На уровне битовой структуры QR-кода запись выглядит так: перед полезными данными в Byte-режиме добавляется ECI-заголовок \1A (управляющий символ) с байтом значения 0x1A (26 в десятичной), после чего следуют сами UTF-8 байты строки. Декодер, получив ECI 26, знает: данные нужно интерпретировать как UTF-8, а не как Latin-1 по умолчанию.

Большинство современных библиотек — `zxing`, `qrcode.js`, `python-qrcode` и другие — при передаче строки с символами вне ASCII автоматически добавляют ECI 26. Но не все. Если генератор молча обрезает или конвертирует данные без ECI-заголовка, сканер покажет QR-код, который читается, но содержит мусор вместо кириллицы.

Кириллица в QR-кодах

Один символ кириллицы занимает 2 байта в UTF-8 (диапазон U+0400–U+04FF). Это прямо влияет на размер QR-символа: слово из 10 русских букв потребует 20 байт вместо 10. Итог — QR-код с кириллическим текстом той же длины будет на 30% крупнее, чем аналогичный ASCII-код. Большее число байт → больше модулей → выше версия символа.

Практическое следствие: если вы генерируете QR для визитки с русским именем и адресом, добавьте 20–30% к запасу площади на носителе. URL-адреса с кириллицей дополнительно кодируются в punycode или percent-encoding — их лучше заменять на короткие ссылки через динамический QR-код.

Альтернатива — транслитерация кириллицы в латиницу: «Иванов» → «Ivanov». Это убирает ECI 26, уменьшает код и повышает совместимость со старыми сканерами. Минус очевиден: читаемость и узнаваемость страдают, особенно для адресов и имён.

Совместимость со сканерами

Современные смартфоны — iOS 11+ и Android 8+ — корректно декодируют ECI 26 и отображают кириллицу без каких-либо настроек. Промышленные сканеры, выпущенные после 2012 года, тоже поддерживают ECI в полном объёме.

Проблемы возникают со старым оборудованием. Сканеры до 2010 года нередко игнорируют ECI-заголовок и интерпретируют байты UTF-8 как Latin-1 — отсюда классические «кракозябры» вроде «Ð Ð¾ÑÑиѻ вместо «Россия». Если ваша аудитория использует корпоративные терминалы с прошивкой 2007–2009 годов (такое встречается в складской логистике), безопаснее перейти на транслитерацию или вынести кириллицу за пределы QR — например, закодировать только URL.

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

Обязательно ли указывать ECI 26 для кириллицы?

Технически — нет, большинство современных сканеров угадывают UTF-8 эвристически. Но стандарт предписывает явное объявление: без ECI 26 поведение декодера формально не определено, и разные устройства могут выдавать разный результат. На практике рекомендация однозначная — при наличии символов вне Latin-1 всегда используйте ECI 26. Это бесплатно с точки зрения совместимости, добавляет всего 3–4 байта к данным и гарантирует правильный результат на любом стандартном сканере выпуска 2010 года и позднее.

Почему QR-код с кириллицей крупнее, чем с латиницей?

Причина — в самой кодировке UTF-8. Символы ASCII (латиница, цифры, знаки препинания) кодируются одним байтом. Символы кириллицы попадают в диапазон U+0400–U+04FF и требуют двух байт каждый. QR-код в Byte-режиме кодирует именно байты, а не символы. Поэтому фраза «Привет, мир» (11 символов) займёт 20 байт, а «Hello, world» (12 символов) — 12 байт. Больше байт — выше версия QR-символа — крупнее матрица на печати. Для длинных русских текстов прирост может достигать 40–50%.

Можно ли смешивать кириллицу и латиницу в одном QR?

Можно. При смешанном контенте генератор объявляет ECI 26 один раз для всего Byte-сегмента, после чего записывает строку в UTF-8 целиком. Латинские символы при этом тоже кодируются как UTF-8 — то есть по одному байту, как обычно. Сканер декодирует весь блок по правилам UTF-8 и получает корректный результат независимо от соотношения языков. Проблемы возникают только если попытаться вручную смешать кодировки внутри одного Byte-сегмента без смены ECI — это нарушение стандарта.

Как проверить, что QR-код с кириллицей сгенерирован правильно?

Простейший способ — открыть любым QR-сканером на смартфоне и убедиться, что кириллица отображается корректно. Более точный вариант: декодировать код программно через zxing или аналог и проверить, есть ли ECI 26 в структуре данных. В zxing результат будет содержать поле resultMetadata с ключом BYTE_SEGMENTS — если кодировка UTF-8, значит ECI 26 присутствует. Если генератор вернул «байтовый» режим без явной кодировки, попробуйте другой сервис или библиотеку с явной настройкой encoding: "utf-8".

Какие альтернативы UTF-8 для кириллицы в QR?

Исторически использовалась кодировка Windows-1251 (CP1251), которая кодирует каждый кириллический символ одним байтом — QR получается компактнее. Её идентификатор ECI отсутствует в стандарте ISO/IEC 18004, поэтому CP1251-коды работали «по договорённости» между конкретным генератором и сканером. Сегодня такой подход нежизнеспособен: смартфоны не знают, что перед ними CP1251, и показывают мусор. Единственная надёжная альтернатива — транслитерация в ASCII, которая убирает проблему кодировки ценой потери читаемости текста.

Создавайте QR-коды бесплатно

Динамические QR-коды с аналитикой, дизайном и без ограничений по сканированиям.

Начать бесплатно