Unicode编码和QR码中的解码问题

12

我正在尝试生成UTF-8格式的QR码,以便对重音和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条形码阅读器 - 嵌入式开源C项目

所有这些工具都给我相同的结果。

您可以尝试这张图像适用于 Unicode字符。

但如果我尝试使用zxing或Google Chart API生成QR码,则无法正确解码。

我尝试过以下方法:

  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
  • http://chart.apis.google.com/chart?cht=qr&chs=200x200&choe=UTF-8&chl=R%C3%A9my+Hubscher
  • 但都没有成功。

    你知道我该怎么做吗?你知道工作图片使用的是哪种编码吗?

    2个回答

    12

    1
    请您能详细地解释一下,您是怎么解决它的? - Zoltán Matók
    你需要添加BOM:http://zh.wikipedia.org/wiki/%E4%BD%8D%E5%85%83%E7%B5%84%E6%A8%99%E8%AA%8C。只需在字符串前打印“\xEF\xBB\xBF”。 - Natim
    你是这个意思吗? NSString *qrString = [NSString stringWithFormat:@"\xEF\xBB\xBF%@",symbol.data]; symbol.data 是 ZBar SDK 扫描后提供的字符串。 顺便说一下,对我来说这并不起作用。 - Zoltán Matók
    更多类似内容:https://dev59.com/BU3Sa4cB1Zd3GeqPrQLf - Natim
    1
    很不幸,那也没有起作用。我已经在问题区提出了一个问题,你能看一下吗? https://dev59.com/H2rXa4cB1Zd3GeqPDuOx - Zoltán Matók
    请解释一下你的解决方案。 - Natim

    4

    常用的启发式算法在QR码解码中经常失败,BOM无济于事

    大多数QR码解码器使用启发式算法自动检测字符编码,即使它明确地通过ECI扩展在QR码内指定。

    事实证明,BOM对你的解码器有所帮助。但对于大多数解码器来说,BOM并不能起到作用。以小米手机MIUI Global v11.0.3(使用其原生扫描应用程序)为例,它不能正确显示生成自你原始问题链接的UTF-8 QR码。以下是它的显示效果: R閙y Hubscher。使用BOM(使用你后续消息中的链接)它会这样显示:?R閙y Hubscher(它只会将BOM字符显示为?)。但是如果在字符串前面添加一个汉字,如日,而不是使用BOM,则小米手机将正确显示该字符串。以下是链接:chart.apis.google.com/chart?cht=qr&chs=200x200&choe=UTF-8&chl=%E6%97%A5R%C3%A9my%20Hubscher

    另一个例子是TWMobile开发的“QR码阅读器和QR码扫描仪”安卓应用程序。它可以适当地解码提供的所有链接中的QR码。因此,你不需要使用BOM使由TWMobile开发的扫描仪正确显示字符串。

    为什么QR解码器总是使用启发式算法来检测字符集,即使这些启发式算法经常失败,如您所示?您知道,QR代码中有四种存储文本的模式:(1)数字,(2)字母数字混合,(3)8位,和(4)汉字。因此,QR码标准本身不支持UTF-8。为了在8位字符串中使用UTF-8编码(而不是默认的“ISO-8859-1”或“JIS8”),实现必须在该字符串之前插入ECI(扩展通道解释)。ECI是QR码的可选附加功能。好的一点是,它至少在2000年的最早QR码标准中就已经定义了。 ECI允许使用除默认字符集之外的字符集进行数据编码。它还使得其他数据解释(例如使用定义的压缩方案压缩的紧凑数据)或其他行业特定要求能够被编码。 ECI协议在由AIM公司开发的规范中定义,并且不是免费提供的,但可以购买。不幸的是,甚至在将默认编码更改为UTF-8这样的基本事项上,不是所有QR解码器都能处理ECI协议。即使对于像“ISO-8859-1”(对于8位字符串模式)或“Shift_JIS”(对于汉字模式)这样的默认编码,解码器仍然使用启发式算法来确定字符集,因为一些编码QR代码的应用程序可能不支持ECI或指定了错误的字符集。
    结论
    由于自动检测字符集的启发式算法,即使通过ECI明确指定正确的编码方式(如您所示),QR解码器经常无法正确显示字符串,并且BOM字符也无法帮助像小米那样的例子。您已经在回复中找到了解决方案,但这对小米没有帮助。有些QR解码器使用的启发式算法是如此愚蠢,以至于即使BOM也不能帮助。
    尽管BOM对您的QR解码器有所帮助,但更好的解决方案是停止使用使用启发式算法的容易出错的QR解码器,即使通过ECI明确指定了字符编码方式也是如此。
    如果解码器无法在没有BOM的情况下正确解码文本,请寻找更好的QR解码器。您提供的编码器(使用链接)是可以的。

    1
    你好@Maxim,感谢你的回答,正如我当时猜测的那样,BOM应该有助于启发式。即使你回答的问题已经过去了将近11年,但我现在仍然在使用Zxing库。 - Natim

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接