ECI (Extended Channel Interpretation)
ECI (Extended Channel Interpretation) — механизм QR-кода, указывающий сканеру кодировку данных: UTF-8, Latin-1 или кириллицу. Без него байты по умолчанию читаются как ISO-8859-1, и кириллица ломается.
ECI, или Extended Channel Interpretation, — служебный механизм QR-кода, который сообщает сканеру, в какой кодовой странице читать байты данных. Он описан в стандарте ISO/IEC 18004 и закрывает одну проблему: сам по себе набор байтов не несёт информации о том, UTF-8 это, Latin-1 или кириллическая кодировка.
Зачем нужен ECI
В байтовом режиме QR хранит просто последовательность байтов, а что они означают — вопрос интерпретации. По умолчанию большинство декодеров трактуют такие байты как ISO-8859-1 (Latin-1): латиница и западноевропейские символы. Пока в данных только латинские буквы и цифры, всё читается верно. Но зашейте кириллицу или эмодзи в UTF-8 — и без подсказки сканер разберёт те же байты как Latin-1, а на экране появятся «крякозябры» вроде прив.
ECI и есть эта подсказка. Индикатор в начале потока данных объявляет: дальше байты в такой-то кодировке, читай их соответственно.
Как задаётся кодировка
ECI записывается служебным индикатором режима перед самими данными. За ним идёт номер назначения — assignment number, код нужной кодовой страницы из реестра ECI. Для UTF-8 это \000026. У каждой поддерживаемой кодировки свой номер: у Latin-1, у кодовых страниц Windows, у кириллических таблиц. Встретив индикатор, сканер переключает интерпретацию байтов на указанную страницу.
Само переключение — часть режимов кодирования QR: ECI работает поверх байтового режима, добавляя к нему смысловую метку кодировки. Без индикатора действует поведение по умолчанию, и корректность чтения зависит от догадок декодера.
ECI и кириллица
Для русского текста цена вопроса высокая: кириллица почти всегда хранится в UTF-8, где одна буква занимает два байта. Индикатор \000026 снимает двусмысленность — сканер точно знает, что перед ним UTF-8, и показывает «Привет», а не «ÐŸÑ€Ð¸Ð²ÐµÑ‚».
Тонкость — в совместимости. Многие камеры смартфонов и без ECI по умолчанию пробуют UTF-8, поэтому кириллица часто читается и так. А часть промышленных и старых сканеров либо строго держится Latin-1, либо, наоборот, не понимает сам индикатор ECI и спотыкается на нём. Единого рецепта нет: для массовой аудитории телефонов чистый UTF-8 без ECI обычно безопаснее, а для строгих ридеров ECI \000026 даёт однозначность. Готовый код стоит проверить на тех устройствах, где им будут пользоваться, — сделать и протестировать его можно в генераторе QR.
Частые вопросы
Что такое ECI в QR-коде простыми словами?
ECI, или Extended Channel Interpretation, — служебная метка внутри QR-кода, которая говорит сканеру, в какой кодировке читать данные. Байты сами по себе не сообщают, UTF-8 это или Latin-1, поэтому ECI задаёт правильную кодовую страницу. Без такой метки декодер полагается на поведение по умолчанию и может прочитать текст неверно.
Почему кириллица в QR-коде превращается в крякозябры?
Русский текст обычно хранится в UTF-8, где буква занимает два байта. Если сканер по умолчанию читает данные как ISO-8859-1 (Latin-1), он разбирает каждый байт как отдельный западный символ — так «Привет» превращается в «ÐŸÑ€Ð¸Ð²ÐµÑ‚». Индикатор ECI \000026 указывает, что это UTF-8, и текст читается верно.
Какой номер ECI отвечает за UTF-8?
UTF-8 соответствует номеру назначения (assignment number) \000026 в реестре ECI. Этот шестизначный код идёт следом за индикатором ECI и переключает интерпретацию байтов на UTF-8. У других кодировок свои номера: у Latin-1, у кодовых страниц Windows и кириллических таблиц — каждая зарегистрирована под собственным значением.
Нужно ли включать ECI для русского текста?
Не всегда. Многие камеры смартфонов по умолчанию пробуют UTF-8, и кириллица читается без ECI. Но строгие или старые сканеры держатся Latin-1 и без метки покажут крякозябры. При этом часть ридеров вовсе не понимает индикатор ECI. Решение зависит от аудитории: проверьте код на реальных устройствах, где им будут пользоваться.
Все ли сканеры поддерживают ECI?
Нет. Поддержка ECI описана в стандарте ISO/IEC 18004, но реализуют её не все читатели. Современные камеры телефонов обычно справляются, а некоторые промышленные и бюджетные сканеры игнорируют индикатор или спотыкаются на нём. ECI повышает однозначность, но не гарантирует совместимость со всеми устройствами — код лучше протестировать заранее.