为QR码选择字符编码

3
我正在开发一个应用程序,它将具备生成包含任意文本数据的QR码的能力。然而,这带来了一个挑战:我期望用户包含像á或ö这样的非ASCII字符。
我收集到的信息来看,QR码的默认编码是ISO-8859-1,但UTF-8似乎是一个常见的选择(并接受更广泛的字符范围,例如阿拉伯语或希伯来语字符,在ISO-8859-1中不会显示)。
然而,我链接的问题没有为我回答一个关键问题 - 我可以期望大多数真实世界的QR码读取器(例如智能手机或任何常用的QR码阅读工具)可靠地读取使用UTF-8编码的QR码吗?使用ISO-8859-1更安全吗?还是我应该假设在QR码中包含非ASCII字符是失败的食谱?
2个回答

5
大多数扫描仪使用启发式方法检测字符编码,无论是否使用默认编码(ISO-8859-1)或通过ECI扩展指定其他编码(如UTF-8)。而这些启发式方法在某些情况下可能会失败。您需要在最可能读取代码的大多数扫描仪下测试您的QR代码,以确定使用ISO-8859-1还是UTF-8和ECI时错误更少。只需记住,不要使用不包括ECI的QR生成器(在UTF-8的情况下),因为生成的QR代码将不能符合标准。
尽管ISO-8859-1是QR代码的默认编码,但这只是在2005年标准更新后才成为默认值。早期版本的标准(ISO/IEC 18004:2000)于2000年发布,指定了与JIS X 0201(JIS8也称为ISO-2022-JP)相一致的8位拉丁/假名字符集作为8位模式的默认编码。
正如您所知,QR代码中有4种文本存储模式:(1)数字,(2)字母数字,(3)8位和(4)汉字。因此,QR代码标准本质上不支持UTF-8。为了在8位字符串中使用UTF-8编码(而不是默认的“ISO-8859-1”或“JIS8”),实现必须在该字符串之前插入一个ECI(扩展通道解释)。ECI是QR代码的可选附加功能,但它至少在2000年的最早QR代码标准中已经被定义。 ECI使数据能够使用除默认字符集以外的字符集进行编码。它还使得其他数据解释(例如,使用定义的压缩方案压缩数据)或其他行业特定要求进行编码成为可能。ECI协议在由AIM,Inc开发的规范中定义,并不免费提供,但可以在https://www.aimglobal.org/technical-symbology.html上以50美元的价格购买。
不幸的是,即使在将默认编码更改为UTF-8这样基本的事情上,也并非所有QR扫描仪都能处理ECI协议。大多数实现使用启发式方法,即猜测编码的一种或另一种字符编码检测算法,即使编码明确指定在解码后的QR代码的ECI中。

因此,您只需要使用各种扫描器来测试您的QR码,以找出哪个结果效果更好。没有通用解决方案。某些扫描器无论如何都会失败,因为它们的启发式算法存在错误。只有那些不使用启发式算法(至少在提供ECI时)的扫描器才不会失败。对于我来说,我会选择ISO-8859-1有两个原因。首先,它不强制使用ECI。其次,与UTF-8相比,仅需要一个字节的ISO-8859-1即可编码非美国ASCII字符(例如á或ö)。因此,您的QR码将使用ISO-8859-1更小,不仅因为需要较少的字节来编码ISO-8859-1字符串,而且因为它通过不包括ECI来带来额外的节省(2个字节)。


1
我做了一些相关研究。首先,我使用“işçöá”字符从this网站生成UTF-8编码的QR码。然后,我简单地打开了我的相机应用程序(iPhone)和Android BarcodeScanner应用程序。它们按预期工作。
在第二步中,我使用ISO-8859-1编码进行QR码生成,令人惊讶的是iPhone相机应用程序无法产生任何结果。
我认为对于QR码阅读的常用工具,您可以信任UTF-8编码。

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