В последнее время мы довольно часто писали о QR-коде и возможностях работы с ним в наших продуктах:
Однако, мы практически не касались технических сторон вопроса.
В режиме Byte входные данные кодируются с помощью одной из кодировок в списке ECI (Extended Channel Interpretation). Алгоритм по очереди проверяет каждую кодировку, определяет, можно ли с ее помощью закодировать все символы входных данных. Если ни одна не подходит – используется универсальная кодировка «UTF-8».
Это все делается для того, чтобы штрих-код имел как можно меньший размер, так как в режиме UTF-8 штрих-код имеет максимально большой размер.
Список кодировок стандарта ECI, которые поддерживаются в нашем продукте для QR-кода (в порядке использования):
Также, многие мобильные приложения для чтения штрих-кодов поддерживают только определенные кодировки, а некоторые приложения вообще не поддерживают стандарт ECI.
К счастью, в последнее время, большинство сканеров способны обработать кодировку UTF-8.
Некоторые кодировки в этом списке похожи. Например, ISO-8859-5 и Windows-1251 содержат символы кириллицы. Поэтому только от входных данных зависит, какая из этих кодировок будет использована для текста. Некоторые сканеры, например, не работают с кодировкой ISO-8859-5 и требуют использования именно Windows-1251.
Например, определим кодировку
- обзорная статья о QR-коде в генераторе отчетов Stimulsoft;
- возможности кастомизации QR-кода;
- встраивание изображений.
Однако, мы практически не касались технических сторон вопроса.
Общий алгоритм применения кодировок
QR-код поддерживает различные режимы записи информации. Обычно алгоритм выбора режима работает следующим образом: сначала анализируются входные данные и проверяется, могут ли они быть записаны в одном из компактных режимов (Numeric, Alphanumeric, Kanji). Если не могут – используется режим Byte.В режиме Byte входные данные кодируются с помощью одной из кодировок в списке ECI (Extended Channel Interpretation). Алгоритм по очереди проверяет каждую кодировку, определяет, можно ли с ее помощью закодировать все символы входных данных. Если ни одна не подходит – используется универсальная кодировка «UTF-8».
Это все делается для того, чтобы штрих-код имел как можно меньший размер, так как в режиме UTF-8 штрих-код имеет максимально большой размер.
Список кодировок стандарта ECI, которые поддерживаются в нашем продукте для QR-кода (в порядке использования):
- "Cp437";
- "ISO-8859-1";
- "ISO-8859-2";
- "ISO-8859-3";
- "ISO-8859-4";
- "ISO-8859-5";
- "ISO-8859-6";
- "ISO-8859-7";
- "ISO-8859-8";
- "ISO-8859-9";
- "ISO-8859-11";
- "ISO-8859-13";
- "ISO-8859-15";
- "Shift_JIS";
- "Windows-1250";
- "Windows-1251";
- "Windows-1252";
- "Windows-1256";
- "UTF-8".
- "ISO-8859-1";
- "Windows-1250";
- "Windows-1251";
- "Windows-1252";
- "Windows-1256";
- "UTF-8".
Проблема неверной кодировки
Разные устройства для чтения штрих-кодов могут поддерживать разные наборы кодировок для декодирования QR-кодов. Например, сканеры штрих-кодов в некоторых странах поддерживают только определенные кодировки, наиболее используемые в этой стране.Также, многие мобильные приложения для чтения штрих-кодов поддерживают только определенные кодировки, а некоторые приложения вообще не поддерживают стандарт ECI.
К счастью, в последнее время, большинство сканеров способны обработать кодировку UTF-8.
Некоторые кодировки в этом списке похожи. Например, ISO-8859-5 и Windows-1251 содержат символы кириллицы. Поэтому только от входных данных зависит, какая из этих кодировок будет использована для текста. Некоторые сканеры, например, не работают с кодировкой ISO-8859-5 и требуют использования именно Windows-1251.
Решение
Когда необходимо определить кодировку, с которой будет начинаться подбор, в наших продуктах предусмотрено статическое свойствоStiOptions.Engine.BarcodeQRCodeDefaultByteModeEncoding
.Например, определим кодировку
Windows_1251
как первоначальную:StiOptions.Engine.BarcodeQRCodeDefaultByteModeEncoding = Stimulsoft.Report.BarCodes.StiQRCodeECIMode.Windows_1251;
Проблема «трёх лишних символов в начале штрих-кода»
Иногда пользователи жалуются, что в начале отсканированной информации появляются лишние символы. Это не ошибка, а особенность кодирования информации в штрих-коде. Если входные данные кодируются с использованием UTF-8, то многие программы (и наш генератор отчетов) перед данными добавляет метку BOM (Byte Order Mark). Эта метка является маркером для некоторых приложений, помогает в определении кодировки. Однако не все сканеры распознают метку BOM, и тогда в начале текста появляются три лишних символа
.Решение
Для того, чтобы избежать этого и не добавлять ко входным данным метку BOM, установите опциюStiOptions.Engine.BarcodeQRCodeAllowUnicodeBOM
в значение false.Если у вас остались вопросы, свяжитесь с нами.