Проблемы кодирования и декодирования Unicode в QRCode

Я пытаюсь сгенерировать QRCode UTF-8, чтобы я мог использовать акценты и символы Unicode.

Чтобы проверить это, я использую множество решений для декодирования:

  1. http://zxing.org/w/decode.jspx — проект zxing, также используемый в Android.
  2. http://www.drhu.org/QRCode/QRDecoder.php — PHP-декодер
  3. http://zbar.sf.net – устройство чтения штрих-кодов ZBar – проект OpenSource и C для встроенных

Все они дают мне всегда один и тот же результат.

Вы можете попробовать это изображение хорошо работает с символами Unicode.

Но если я пытаюсь использовать zxing или Google Chart API для создания QRCode, я не могу его правильно декодировать.

Я пробовал это:

  1. http://chart.apis.google.com/chart?cht=qr&chs=200x200&choe=SHIFT_JIS&chl=R%C3%A9my+Hubscher
  2. http://chart.apis.google.com/chart?cht=qr&chs=200x200&choe=ISO-8859-1&chl=R%C3%A9my+Hubscher
  3. http://chart.apis.google.com/chart?cht=qr&chs=200x200&choe=UTF-8&chl=R%C3%A9my+Hubscher

Но все безуспешно.

Вы знаете, как я могу сделать? Знаете ли вы, какая кодировка используется для рабочего изображения?


person Natim    schedule 23.10.2009    source источник


Ответы (2)


Решение, которое приходит, состоит в том, чтобы закодировать текст в UTF-8 и добавить спецификацию, чтобы указать, что строка на самом деле находится в UTF-8.

Вот это работает:

person Natim    schedule 23.10.2009
comment
Не могли бы вы объяснить, что именно вы сделали, чтобы решить эту проблему? - person Zoltán Matók; 14.11.2012
comment
Вы должны добавить спецификацию: en.wikipedia.org/wiki/Byte_order_mark. Просто напечатайте \xEF\xBB\xBF перед вашей строкой. - person Natim; 14.11.2012
comment
Вы имеете в виду вот так? NSString *qrString = [NSString stringWithFormat:@\xEF\xBB\xBF%@,symbol.data]; symbol.data — это строка, которую ZBar SDK предоставляет после сканирования. Это не работает для меня, кстати. - person Zoltán Matók; 14.11.2012
comment
Больше похоже на это: stackoverflow.com /вопросы/2585024/ - person Natim; 14.11.2012
comment
Это тоже не сработало, к сожалению. Я открыл вопрос о проблеме, не могли бы вы взглянуть на нее? stackoverflow.com/questions/13395311/ - person Zoltán Matók; 15.11.2012
comment
Пожалуйста, объясните, каково было ваше решение. - person Natim; 15.11.2012

Эвристика, используемая 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
comment
Здравствуйте @Maxim, спасибо за ваш ответ, это то, о чем я догадался в то время, и имхо, спецификация должна помочь эвристике. Я до сих пор использую библиотеку Zxing, хотя вопросу, на который вы ответили, почти 11 лет. - person Natim; 06.04.2020