QRCode中的Unicode编码和解码问题

问题描述 投票:9回答:2

我正在尝试生成UTF-8 QRCode,以便可以重读重音和Unicode字符。

为了测试,我正在使用许多解码解决方案:

  1. [http://zxing.org/w/decode.jspx-在Android中也使用的zxing项目
  2. [http://www.drhu.org/QRCode/QRDecoder.php-一个PHP解码器]
  3. [http://zbar.sf.net-ZBar条形码阅读器-嵌入式的OpenSource和C项目

所有人都给我相同的结果。

您可以尝试this image works well with 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

但是都没有成功。

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

unicode encoding character-encoding decoding qr-code
2个回答
10
投票

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

在这里有效:


0
投票

QR解码器使用的启发式方法通常会失败,BOM无法帮助

即使大多数QR解码器通过ECI扩展名在QR代码内部明确指定,大多数QR解码器仍使用启发式方法来自动检测字符编码。

事实是BOM有助于您的解码器。但是对于大多数解码器而言,BOM没有帮助。作为无法显示正确的UTF-8字符串的解码器的示例,请使用带有MIUI Global v11.0.3的Xiaomi手机(及其本地扫描仪应用程序)。该电话无法正确显示您原始问题中产生的链接的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小米会正确显示此链接生成的QR码中的字符串日Rémy Hubscher

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

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

结论

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.