简体中文

文本和日常工具·二维码和条形码工具包

为什么带重音的文本有时会在 QR 码中扫描错误:字符集和 ECI

· 背景

二维码 编码 浏览器处理

UTF-8 字节进入 QR 网格并解码为带重音的文本和日语文本
原始 ToolAcre 矢量图

解释了为什么 QR 标准的默认字节解释不是 UTF-8、扩展通道解释机制的作用,以及为什么一些读者会针对重音或非拉丁文本显示 mojibake。

扫描为“é”的名称 — mojibake 在解码的二维码中是什么样子以及为什么会发生

当在另一个字符映射下解释 UTF-8 字节时,会出现诸如 é 之类的 Mojibake。 ToolAcre 通过使用 TextEncoder 解决了矩阵生成之前的失败问题,并测试了往返重音、日语和表情符号示例。

腐败是沉默的,因为 QR 可以在结构上保持有效。扫描仪解码字节,应用不同的字符解释并显示错误的文本,因此查找模式和纠错似乎都起作用。 ToolAcre 的回归测试将解码输出与原始样本(例如 `café`、日语文本和表情符号)进行比较。这捕获了黑色模块的视觉快照永远无法检测到的语义损坏。

ToolAcre 预编码 UTF-8 字节以避免依赖项的 Latin-1 默认行为

底层 QR 依赖项将其字节模式字符串视为 Latin-1 传递数据。 ToolAcre 首先将预期文本转换为 UTF-8 字节,并将每个字节映射到一个代码单元,以便库接收正确的八位字节而不是损坏字符。

转换包装器创建一个 `Uint8Array`,将其分块处理并生成一个二进制字符串,其代码单元等于 UTF-8 字节值。然后,该库的 Latin-1 传递会保留这些值,而不是重新编码原始 JavaScript 字符。分块可以避免向 `String.fromCharCode` 传递过多的参数,同时避免全局库突变使其他调用者保持隔离。

ECI只是背景;此实现并不声称发出 ECI 标头

扩展通道解释可以标记 QR 系统中的字符编码,但在此实现中不会出现 ECI 发射。因此,本文不承诺 ECI 标头,也不将其描述为 ToolAcre UTF-8 支持背后的机制。

ECI 对于解码器来说是一个单独的信号,但 ToolAcre 不会请求或公开该信号。它的兼容性策略是正确的 UTF-8 字节加上设备测试,而不是广告的编码标头。这种区别在支持方面很重要:成功的存储库往返证明了字节准备和矩阵恢复;它不能证明每个外部读取器在每个有效负载上下文中都选择相同的字符解释。

存储库测试证明矩阵往返,而不是跨指定第三方相机应用程序的行为

该存储库在测试中解码生成的矩阵并证明其自己的字节往返。它不会测试每个相机应用程序,因此有关读者猜测 UTF-8 或在特定平台上失败的说法需要单独的设备证据。

测试中使用的单元解码器是受控的并且对于回归有价值,但它不是相机应用程序的目录。记录观众实际使用的设备的结果,包括解码的字符串,而不是“扫描成功”。两个应用程序都可以识别代码,而一个应用程序则显示 mojibake。将此类差异报告为读卡器兼容性证据,而不是在不了解解码器的情况下更改 ToolAcre 的字节。

降低风险 - 尽可能将有效负载保留为 ASCII,对非 ASCII 路径进行 URL 编码,并在多部手机上进行测试

保持有效负载简洁,当普通 HTTPS URL 可以在网页上表示多语言内容时更喜欢它们,并在支持的设备上测试直接非 ASCII 文本。 URL 编码可能会更改 URL 的字节,并且必须保留目标语义。

稳定的 URL 通常会降低这种风险,因为非 ASCII 表示可以存在于目标页面上,而 QR 有效负载仍然是简洁的 ASCII 地址。如果 URL 路径包含国际字符,请保留其正确编码的目标并进行测试;盲目的百分比编码或音译可能会改变路由。对于直接接触或纯文本,请保持测试矩阵较小并使用多个支持的阅读器进行扫描。

工作示例:验证实现中的 UTF-8 往返并分别测试外部读取器

在单独的测试代码中对咖啡馆、日本和表情符号进行编码,确认存储库的解码器返回原始文本,然后使用受众使用的真实应用程序扫描导出的图像。记录差异,而不是通过一部手机进行概括。

使用三个单独的有效负载 - `café`、一个简短的日语短语和一个表情符号 - 然后使用存储库测试路径和选定的手机应用程序对每个有效负载进行解码。比较确切的 Unicode 字符,而不是屏幕截图或视觉相似性。如果应用程序失败,请保留导出的代码和解码的字节以进行诊断。从相同的输入重复重新生成应该产生相同的矩阵,并且不会修复读者解释的差异。

这不包括什么 - 汉字模式的 Shift JIS 细节和扫描设备上的字体渲染

汉字模式 Shift JIS 详细信息和解码后的字体渲染不在实现范围内。 QR存储字节;扫描仪和目标界面决定如何将解码的字符呈现给拿着手机的人。

Kanji 模式、Shift JIS 和解码后字体选择不在实现范围内。即使正确的 Unicode 也可能在缺乏合适字体的设备上呈现缺失的字形,这与接收错误的字符不同。记录故障时单独的字节损坏、解码器解释和字体显示;它们发生在不同的阶段,需要不同的补救措施。

要点 — 在打印之前测试任何非 ASCII 有效负载;二维码和条形码工具包在本地生成,以便您可以快速迭代

ToolAcre 的经过验证的声明很强大,但有限制:它正确准备 UTF-8 字节并往返多语言测试字符串。具有非 ASCII 有效负载的印刷版本仍然值得有代表性的读者测试。

多语言印刷的发布标准是对代表性读者的精确恢复。 ToolAcre 提供经过验证的 UTF-8 准备和本地生成,其字节计数器反映了多字节成本。发布者仍必须保留经过测试的工件,避免未经审查的有效负载编辑,并在兼容性较窄的情况下披露读者要求。正确的编码是必要的,但用户体验整个解码、解释和显示链。