Эвристика, используемая QR-декодерами, часто дает сбои, BOM не помогает
Большинство QR-декодеров используют эвристику для автоматического определения кодировки символов, даже если она явно указана внутри QR-кода через расширение ECI.
Оказалось, что BOM помог вашему декодеру. Но для большинства декодеров спецификация не помогает. В качестве примера декодера, который не может отобразить правильную строку UTF-8, возьмем телефон Xiaomi с MIUI Global v11.0.3 (с родным приложением сканера). Этот телефон не может правильно отображать QR-код UTF-8, созданный по ссылке в исходном вопросе. Вот как это было показано: R閙y Hubscher
. Со спецификацией (используя ссылку из вашего последующего сообщения) это выглядело так: ?R閙y Hubscher
(она просто показывала символ спецификации как?). Но если вы добавите китайский символ, например 日, перед строкой вместо спецификации, Xiaomi отобразит строку правильно. Вот ссылка: chart.apis.google.com/chart?cht=qr&chs=200x200&choe=UTF-8&chl=%E6%97%A5R%C3%A9my%20Hubscher Xiaomi правильно отображает строку 日Rémy Hubscher
из QR-кода, сгенерированного этим ссылка на сайт.
Другим примером является Android-приложение «Считыватель QR-кода и сканер QR-кода» от TWMobile. Он правильно расшифровал все QR-коды со всех ссылок, которые вы предоставили. Таким образом, вам не нужно было использовать спецификацию, чтобы сканер от TWMobile правильно отображал строки.
Почему декодеры QR всегда используют эвристику для определения набора символов, даже если эта эвристика часто дает сбой, как показано в вашем случае? Как вы знаете, существует 4 режима хранения текста в QR-коде: (1) числовой, (2) буквенно-цифровой, (3) 8-битный и (4) кандзи. Таким образом, стандарт QR-кода по своей сути не поддерживает UTF-8. Чтобы использовать кодировку UTF-8 (вместо стандартного «ISO-8859-1» или «JIS8») в 8-битной строке, реализация должна вставить ECI (расширенные интерпретации канала) перед этой строкой. ECI — это необязательная дополнительная функция для QR-кода. Хорошо, что он был определен в самом раннем стандарте QR-кода, по крайней мере, в 2000 году. ECI позволяет кодировать данные с использованием наборов символов, отличных от установленных по умолчанию. Он также позволяет интерпретировать другие данные (например, сжатые данные с использованием определенных схем сжатия) или кодировать другие отраслевые требования. Протокол ECI определен в спецификации, разработанной AIM, Inc, и не предоставляется бесплатно, но его можно приобрести за определенную плату. К сожалению, не все декодеры QR могут работать с протоколом ECI, даже в такой простой вещи, как изменение кодировки по умолчанию на UTF-8. И даже для кодировки по умолчанию, такой как «ISO-8859-1» (для режима 8-битной строки) или «Shift_JIS» (для режима кандзи), декодеры по-прежнему используют эвристику для определения набора символов, потому что некоторые приложения, кодирующие QR-коды, могут не работать. поддерживать ECI или указать неверный набор символов.
Вывод
Из-за эвристики для автоматического определения набора символов декодеры QR часто не отображают строку правильно, даже если правильная кодировка явно указана через ECI, как это было в вашем случае, и символ спецификации не помог, как показано в примере Xiaomi. Вы нашли решение в своем ответе, но это не помогло для Xiaomi. Некоторые QR-декодеры используют эвристические алгоритмы, настолько тупые, что даже BOM не помогает.
Хотя спецификация действительно помогла с вашим декодером QR, лучшим решением было бы прекратить использование подверженных ошибкам декодеров QR, которые используют эвристику, даже если кодировка символов явно указана через ECI.
Найдите лучший декодер QR, если декодер не может правильно декодировать текст без спецификации. Кодировщик, который вы предоставили (по ссылкам), в порядке.
person
Maxim Masiutin
schedule
05.04.2020