选择 QR 码的字符编码

unp*_*ito 4 qr-code utf-8 character-encoding

我正在构建一个应用程序,它将能够生成包括任意文本数据的二维码。然而,这提出了一个挑战:我希望用户包含非 ASCII 字符,例如 \xc3\xa1 或 \xc3\xb6。

\n\n

根据我收集的信息,QR 码的默认值是 ISO-8859-1,但 UTF-8 似乎是一个常见的选择(并且接受更广泛的字符,例如阿拉伯语或希伯来语字符,这些字符不会见 ISO-8859-1)。

\n\n

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

\n

Max*_*tin 5

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

\n\n

虽然 ISO-8859-1 是 QR 码的默认编码,但直到 2005 年标准更新后才变成这样。该标准的早期版本于 2000 年发布 (ISO/IEC 18004:2000),确实根据 JIS X 0201(JIS8 也称为 ISO-2022-JP)指定了 8 位拉丁语/假名字符集作为 8 的默认编码。位模式。

\n\n

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

\n\n

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

\n\n

因此,您只需使用各种扫描仪测试您的二维码即可找出哪种结果更好。没有通用的解决方案。某些扫描仪无论如何都会因为启发式错误而失败。只有那些不使用启发式的方法(至少在提供 ECI 时)才不会失败。对于我来说,我会选择 ISO-8859-1,原因有两个。首先,它不强制要求使用 ECI。其次,ISO-8859-1 只需要一个字节即可对 \xc3\xa1 或 \xc3\xb6 等非 US-ASCII 字符进行编码,而 UTF-8 则需要两个字节来编码这些字符。因此,使用 ISO-8859-1 时,QR 码会更小,不仅因为编码 ISO-8859-1 字符串需要更少的字节,而且还因为它通过不包含 ECI 带来了额外的节省(2 个字节)。

\n