Перейти к содержимому

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.