我正在构建一个应用程序,它将能够生成包括任意文本数据的二维码。然而,这提出了一个挑战:我希望用户包含非 ASCII 字符,例如 á 或 ö。
根据我收集的信息,QR 码的默认值是 ISO-8859-1,但 UTF-8 似乎是一种常见的选择(并且接受更广泛的字符,例如阿拉伯语或希伯来语字符)未在 ISO-8859-1 中显示)。
但是,我链接的问题并没有回答对我来说至关重要的问题 - 我能否期望大多数现实世界的 QR 码阅读器(例如智能手机或任何常用的 QR 阅读工具)能够可靠地使用 UTF-8 读取 QR 码编码?使用 ISO-8859-1 是否更安全?或者我应该假设在 QR 码中包含非 ASCII 字符会导致失败?
大多数 QR 码扫描仪使用启发式方法来检测字符编码,无论是使用默认编码 (ISO-8859-1) 还是通过 ECI 扩展指定其他编码(如 UTF-8)。这些启发式方法在某些条件下可能会失败。您需要使用最广泛的扫描仪测试您的 QR 码,以确定哪个产生的错误较少:ISO-8859-1 或带有 ECI 的 UTF-8。请勿使用省略 UTF-8 ECI 的 QR 码生成器,因为生成的 QR 码不符合标准。
虽然 ISO-8859-1 是 QR 码的默认编码,但直到 2005 年标准更新后才变成这样。该标准的早期版本于 2000 年发布 (ISO/IEC 18004:2000),指定根据 JIS X 0201(也称为 JIS8 或 ISO-2022-JP)的 8 位拉丁语/假名字符集作为默认编码对于 8 位模式。
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开发的规范中定义的,可以在AIM Global以 50 美元的价格购买。
不幸的是,并非所有 QR 扫描仪都可以处理 ECI 协议,即使对于将默认编码更改为 UTF-8 等基本任务也是如此。大多数实现都使用启发式(字符编码检测算法)来猜测编码,即使在解码的 QR 码的 ECI 中明确指定了编码。您需要使用各种扫描仪测试您的二维码,以确定哪个选项可以产生更好的结果。没有通用的解决方案。有些扫描仪会由于启发式错误而失败。只有不使用启发式的扫描仪(至少在提供 ECI 时)才能避免此类问题。就我个人而言,我会选择 ISO-8859-1 有两个原因。首先,它不需要使用ECI。其次,ISO-8859-1 只需要一个字节即可对 á 或 ö 等非 US-ASCII 字符进行编码,而 UTF-8 则需要两个字节来编码这些字符。因此,采用 ISO-8859-1 的 QR 码会更小,不仅因为编码 ISO-8859-1 字符串需要更少的字节,而且还因为省略了 ECI,总大小还少了 2 个字节。
this 站点生成 UTF-8 编码的二维码。然后我只需打开我的相机应用程序(iPhone)和 Android BarcodeScanner 应用程序。他们按预期工作。
在第二步中,我使用ISO-8859-1编码来生成QR码,令人惊讶的是iPhone相机应用程序无法产生任何结果。我认为您可以信任有关二维码阅读的常用工具的UTF-8编码。