选择QR码的字符编码



我正在构建一个应用程序,该应用程序将能够生成包括任意文本数据的QR代码。然而,这带来了一个挑战:我希望用户包括非ASCII字符,如áorö。

据我所知,QR码的默认值是ISO-8859-1,但UTF-8似乎是一个常见的选择(它接受更广泛的字符,例如ISO-8859-1中不会显示的阿拉伯语或希伯来语字符(。

然而,我链接的问题并不能回答我的一个重要问题——我能指望大多数现实世界的二维码阅读器(例如智能手机或任何常用的二维码阅读工具(可靠地阅读UTF-8编码的二维码吗?使用ISO-8859-1是否更安全?或者我应该假设在二维码中包含非ASCII字符会导致失败?

无论使用默认编码(ISO-8859-1(还是通过ECI扩展指定其他编码(如UTF-8(,大多数扫描仪都使用启发式方法来检测字符编码。这些启发式方法在某些情况下可能会失败。您必须在最有可能读取代码的扫描仪下测试您的二维码,以找出错误较少的地方:使用ISO-8859-1或使用UTF-8和ECI。请记住,在UTF-8的情况下,不要使用不包括ECI的QR生成器——在这种情况下,生成的QR代码将不符合标准。

尽管ISO-8859-1是QR码的默认编码,但只有在2005年标准更新后才如此。2000年发布的标准的早期版本(ISO/IEC 18004:2000(确实根据JIS X 0201(JIS8也称为ISO-2022-JP(指定了8位拉丁/假名字符集作为8位模式的默认编码。

如您所知,在二维码中存储文本有4种模式:(1(数字、(2(字母数字、(3(8位和(4(汉字。所以,二维码标准本身并不支持UTF-8。要在8位字符串中使用UTF-8编码(而不是默认的"ISO-8859-1"或"JIS8"(,实现必须在该字符串之前插入ECI(扩展通道解释(。ECI是二维码的一个可选的附加功能,但它至少在2000年在最早的二维码标准中被定义。ECI启用使用默认字符集以外的字符集进行数据编码。它还允许对其他数据解释(例如,使用定义的压缩方案压缩的数据(或其他行业特定要求进行编码。ECI协议在AIM,Inc开发的规范中进行了定义,不可免费获得,但可在https://www.aimglobal.org/technical-symbology.html

不幸的是,并不是所有的QR扫描仪都能处理ECI协议,即使是在将默认编码更改为UTF-8这样一个基本的事情上也是如此。大多数实现使用启发式,即一个或另一个字符编码检测算法来猜测编码,即使在解码的QR码的ECI中明确指定了编码。

所以,你只需要用各种扫描仪测试你的二维码,就可以找出哪种结果更好。没有普遍的解决办法。某些扫描仪无论如何都会失败,因为它们的启发式方法有错误。只有那些不使用启发式的(至少在提供ECI时(不会失败。至于我,我选择ISO-8859-1有两个原因。首先,它没有强制使用ECI。其次,ISO-8859-1只需要一个字节就可以编码非美国ASCII字符,如áorö,而UTF-8则需要两个字节。因此,使用ISO-8859-1,QR码会更小,这不仅是因为编码ISO-8859-1字符串所需的字节更少,还因为它不包括ECI带来了额外的节省(2个字节(。

我对此做了一些小的研究。首先,我使用"Işçá"字符从这个网站生成了UTF-8编码的qr码。然后我简单地打开我的相机应用程序(iphone(和安卓BarcodeScanner应用程序。他们按预期工作。

在第二步中,我使用ISO-8859-1编码生成二维码,令人惊讶的是,iPhone相机应用程序无法产生任何结果。

我认为你可以相信UTF-8编码是QR阅读的常用工具。

最新更新