12

我正在尝试生成 UTF-8 QRCode,以便我可以重新添加重音符号和 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 生成 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

但都没有成功。

你知道我该怎么做吗?您知道工作图像使用哪种编码吗?

4

2 回答 2

12

出现的解决方案是将文本编码为 UTF-8 并添加一个 BOM 以指定该字符串实际上是 UTF-8。

在这里有效:

于 2009-10-23T15:23:53.437 回答
3

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

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

事实证明,BOM 对您的解码器有所帮助。但是对于大多数解码器来说,BOM 并没有帮助。作为无法显示正确 UTF-8 字符串的解码器的示例,请使用装有 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 小米正确显示日Rémy Hubscher来自此链接生成的二维码的字符串.

另一个例子是 TWMobile 的“QR 码阅读器和 QR 码扫描仪”Android 应用程序。它确实正确解码了您提供的所有链接中的所有二维码。因此,您不必使用 BOM 来使 TWMobile 的扫描仪正确显示字符串。

为什么 QR 解码器总是使用启发式方法来检测字符集,即使这些启发式方法经常失败,如您的案例所示?如您所知,在二维码中存储文本有 4 种模式:(1) 数字、(2) 字母数字、(3) 8 位和 (4) 汉字。因此,二维码标准本身并不支持 UTF-8。要在 8 位字符串中使用 UTF-8 编码(而不是默认的“ISO-8859-1”或“JIS8”),实现必须在该字符串之前插入一个 ECI(扩展通道解释)。ECI 是 QR 码的可选附加功能。好的一点是它至少在 2000 年在最早的 QR 码标准中定义。ECI 允许使用默认字符集以外的字符集进行数据编码。它还可以对其他数据解释(例如,使用定义的压缩方案的压缩数据)或其他行业特定要求进行编码。AIM, Inc不是免费提供的,但可以付费购买。不幸的是,并非所有 QR 解码器都可以处理 ECI 协议,即使是在将默认编码更改为 UTF-8 这样基本的事情中也是如此。甚至对于像“ISO-8859-1”(8 位字符串模式)或“Shift_JIS”(汉字模式)这样的默认编码,解码器仍然使用启发式方法来确定字符集,因为某些编码 QR 码的应用程序可能不会支持 ECI 或指定不正确的字符集。

结论

由于自动检测字符集的启发式方法,QR 解码器通常无法正确显示字符串,即使在您的情况下通过 ECI 明确指定正确的编码并且 BOM 字符没有帮助,如小米示例所示。您在回复中找到了解决方案,但对小米没有帮助。一些 QR 解码器使用的启发式算法非常愚蠢,甚至 BOM 也无济于事。

尽管 BOM 确实对您的 QR 解码器有所帮助,但更好的解决方案是停止使用使用启发式算法的容易出错的 QR 解码器,即使通过 ECI 明确指定了字符编码。

如果解码器在没有 BOM 的情况下无法正确解码文本,请寻找更好的 QR 解码器。您提供的编码器(使用链接)没问题。

于 2020-04-05T00:27:06.240 回答