为QR码选择字符编码

时间:2018-07-25 10:27:19

标签: utf-8 character-encoding qr-code

我正在构建一个应用程序,它将能够生成包括任意文本数据的QR码。但是,这带来了一个挑战:我希望用户包含á或ö等非ASCII字符。

From what I've gathered,QR码的默认值为ISO-8859-1,但UTF-8似乎是一个常见的选择(并且接受范围更广的字符,例如阿拉伯语或希伯来语字符在ISO-8859-1中显示)。

但是,我链接的问题对我来说并没有回答一个至关重要的问题-我可以期望大多数现实世界中的QR码阅读器(例如,智能手机或任何常用的QR阅读工具)使用UTF可靠地阅读QR码-8编码?改为使用ISO-8859-1安全吗?还是我应该以为在QR码中包含非ASCII字符会导致失败?

谢谢你!

2 个答案:

答案 0 :(得分:3)

大多数扫描程序都使用启发式方法来检测字符编码,而不管是使用默认编码(ISO-8859-1)还是通过ECI扩展指定其他某种编码(例如UTF-8)。而且这些启发式方法在某些情况下可能会失败。您必须在最有可能的扫描仪上测试QR码,这些扫描仪会读取您的代码以找出错误少的地方: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种在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 开发的规范中定义的,它不是免费提供的,但可以在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仅需要一个字节来编码á或ö等非US-ASCII字符,而UTF-8则需要两个字节。因此,使用ISO-8859-1的QR码会更小,这不仅是因为编码ISO-8859-1字符串所需的字节数更少,而且还因为它不包括ECI带来了额外的节省(2字节)。

答案 1 :(得分:1)

我对此进行了少量研究。首先,我使用{işçöá”字符从this网站生成了UTF-8编码的二维码。然后,我只需打开相机应用程序(iphone)和Android BarcodeScanner应用程序。他们按预期工作。

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

我认为您可以将UTF-8编码用于QR阅读的常用工具。