选择 QR 码的字符编码
Choosing a character encoding for QR Codes
我正在构建一个能够生成包含任意文本数据的二维码的应用程序。然而,这带来了挑战:我希望用户包含非 ASCII 字符,例如 á 或 ö。
From what I've gathered,QR 码的默认值是 ISO-8859-1,但 UTF-8 似乎是一个常见的选择(并且接受更广泛的字符,例如阿拉伯语或希伯来语字符不会显示在 ISO-8859-1 中)。
但是,我链接的问题并没有回答对我来说至关重要的问题 - 我能否期望大多数真实世界的二维码阅读器(例如,智能手机或任何常用的二维码阅读工具)能够可靠地读取二维码使用UTF-8编码?改用 ISO-8859-1 是否更安全?或者我应该假设在 QR 码中包含非 ASCII 字符是失败的秘诀?
我对此做了一些小调查。首先,我使用 "işçöá" 个字符从 this 站点生成了 UTF-8 编码的二维码。然后我只需打开我的相机应用程序 (iphone) 和 Android BarcodeScanner 应用程序。他们按预期工作。
在第二步中,我使用 ISO-8859-1 编码生成 QR 码,令人惊讶的是 iPhone 相机应用程序无法生成任何结果。
我认为您可以信任 UTF-8 编码的二维码阅读常用工具。
大多数扫描器使用启发式方法来检测字符编码,无论是使用默认编码 (ISO-8859-1) 还是通过 ECI 扩展指定了其他编码(如 UTF-8)。这些启发式方法在某些情况下可能会失败。您必须在最可能的扫描仪下测试您的二维码,这些扫描仪将读取您的代码以找出错误较少的地方:使用 ISO-8859-1 或使用 UTF-8 和 ECI。请记住,在 UTF-8 的情况下,不要使用不包含 ECI 的二维码生成器——在这种情况下,生成的二维码将不符合标准。
虽然 ISO-8859-1 是 QR 码的默认编码,但在 2005 年标准更新后才变成这样。该标准的早期版本于 2000 年发布 (ISO/IEC 18004:2000),并根据 JIS X 0201(JIS8 也称为 ISO-2022-JP)指定了 8 位 Latin/Kana 字符集) 作为 8 位模式的默认编码。
如您所知,QR 码中有 4 种文本存储模式:(1) 数字、(2) 字母数字、(3) 8 位和 (4) 汉字。所以,二维码标准本身并不支持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 美元的价格购买
不幸的是,并非所有 QR 扫描仪都可以处理 ECI 协议,即使是将默认编码更改为 UTF-8 这样的基本操作也是如此。大多数实现使用启发式算法,即一种或另一种字符编码检测算法来猜测编码,即使在解码的 QR 码的 ECI 中明确指定了编码。
因此,您只需使用各种扫描仪测试您的 QR 码,以确定哪个结果的效果更好。没有通用的解决方案。某些扫描器无论如何都会因为它们的启发式错误而失败。只有那些不使用启发式方法(至少在提供 ECI 时)不会失败。至于我,我会选择 ISO-8859-1 有两个原因。首先,它不强制使用 ECI。其次,与 UTF-8 相比,ISO-8859-1 只需要一个字节来编码非 US-ASCII 字符,例如 á 或 ö,这些字符需要两个字节。因此,使用 ISO-8859-1 的 QR 码会更小,这不仅是因为编码 ISO-8859-1 字符串所需的字节更少,而且还因为它通过不包括 ECI 带来了额外的节省(2 个字节)。
我正在构建一个能够生成包含任意文本数据的二维码的应用程序。然而,这带来了挑战:我希望用户包含非 ASCII 字符,例如 á 或 ö。
From what I've gathered,QR 码的默认值是 ISO-8859-1,但 UTF-8 似乎是一个常见的选择(并且接受更广泛的字符,例如阿拉伯语或希伯来语字符不会显示在 ISO-8859-1 中)。
但是,我链接的问题并没有回答对我来说至关重要的问题 - 我能否期望大多数真实世界的二维码阅读器(例如,智能手机或任何常用的二维码阅读工具)能够可靠地读取二维码使用UTF-8编码?改用 ISO-8859-1 是否更安全?或者我应该假设在 QR 码中包含非 ASCII 字符是失败的秘诀?
我对此做了一些小调查。首先,我使用 "işçöá" 个字符从 this 站点生成了 UTF-8 编码的二维码。然后我只需打开我的相机应用程序 (iphone) 和 Android BarcodeScanner 应用程序。他们按预期工作。
在第二步中,我使用 ISO-8859-1 编码生成 QR 码,令人惊讶的是 iPhone 相机应用程序无法生成任何结果。
我认为您可以信任 UTF-8 编码的二维码阅读常用工具。
大多数扫描器使用启发式方法来检测字符编码,无论是使用默认编码 (ISO-8859-1) 还是通过 ECI 扩展指定了其他编码(如 UTF-8)。这些启发式方法在某些情况下可能会失败。您必须在最可能的扫描仪下测试您的二维码,这些扫描仪将读取您的代码以找出错误较少的地方:使用 ISO-8859-1 或使用 UTF-8 和 ECI。请记住,在 UTF-8 的情况下,不要使用不包含 ECI 的二维码生成器——在这种情况下,生成的二维码将不符合标准。
虽然 ISO-8859-1 是 QR 码的默认编码,但在 2005 年标准更新后才变成这样。该标准的早期版本于 2000 年发布 (ISO/IEC 18004:2000),并根据 JIS X 0201(JIS8 也称为 ISO-2022-JP)指定了 8 位 Latin/Kana 字符集) 作为 8 位模式的默认编码。
如您所知,QR 码中有 4 种文本存储模式:(1) 数字、(2) 字母数字、(3) 8 位和 (4) 汉字。所以,二维码标准本身并不支持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 美元的价格购买不幸的是,并非所有 QR 扫描仪都可以处理 ECI 协议,即使是将默认编码更改为 UTF-8 这样的基本操作也是如此。大多数实现使用启发式算法,即一种或另一种字符编码检测算法来猜测编码,即使在解码的 QR 码的 ECI 中明确指定了编码。
因此,您只需使用各种扫描仪测试您的 QR 码,以确定哪个结果的效果更好。没有通用的解决方案。某些扫描器无论如何都会因为它们的启发式错误而失败。只有那些不使用启发式方法(至少在提供 ECI 时)不会失败。至于我,我会选择 ISO-8859-1 有两个原因。首先,它不强制使用 ECI。其次,与 UTF-8 相比,ISO-8859-1 只需要一个字节来编码非 US-ASCII 字符,例如 á 或 ö,这些字符需要两个字节。因此,使用 ISO-8859-1 的 QR 码会更小,这不仅是因为编码 ISO-8859-1 字符串所需的字节更少,而且还因为它通过不包括 ECI 带来了额外的节省(2 个字节)。