二维码看起来像一块黑白小方格,实际生成过程比“把文本画成格子”复杂得多。一个 URL、Wi-Fi 配置或普通文本,最终需要经过数据编码、纠错码计算、矩阵排布和掩码评分,才能变成手机容易识别的图案。
以 QR Code Generator 为例,输入内容在浏览器本地生成静态二维码,可下载 PNG 或 SVG。理解底层过程后,二维码为什么会变密、为什么能容忍部分遮挡、为什么有时同一内容会生成不同图案,都会更容易解释。
从字符串到二维码矩阵
二维码生成可以概括为下面这条链路:
原始内容
→ 选择编码模式
→ 写入长度与数据位
→ 补齐到当前版本容量
→ 计算 Reed-Solomon 纠错码
→ 分块交织
→ 填入二维码矩阵
→ 尝试 8 种掩码
→ 选择评分最低的图案
二维码并不直接保存“字符”。例如网址中的字母、数字和符号,首先会根据内容选择合适的编码模式。
常见模式包括:
- 数字模式:适合纯数字内容,单位长度占用最少;
- 字母数字模式:支持数字、大写字母和部分符号;
- 字节模式:常用于 URL、UTF-8 文本和中文;
- 汉字模式:针对部分日文汉字编码场景。
实际生成器通常会根据输入自动选择模式,或统一采用字节模式。前者容量更高,后者实现更直接。
编码后的数据前面还要写入模式标识与字符长度。随后生成器根据数据量和纠错级别,选择二维码版本。版本越高,矩阵边长越大:版本 1 是 21×21,之后每升一个版本,边长增加 4 个模块。
为什么二维码损坏一点还能扫出来
二维码的容错能力来自 Reed-Solomon 纠错码。它不是简单重复几遍内容,而是在有限域 GF(256) 上计算一组校验码字。
可以把原始数据看作一个多项式。编码器根据指定的生成多项式计算余数,这部分余数就是纠错码。扫描端拿到数据后,会重新计算校验结果;如果部分模块因污损、反光或印刷误差而读错,就能通过这些校验信息定位并修复一定数量的错误。
QR Code 常见的纠错等级有四档:
| 纠错等级 | 常见近似说明 | 适合的场景 |
|---|---|---|
| L | 约可恢复 7% 的码字错误 | 内容较短、画面干净的屏幕展示 |
| M | 约可恢复 15% | 常规网页、文档和普通印刷 |
| Q | 约可恢复 25% | 印刷条件一般,或有少量遮挡 |
| H | 约可恢复 30% | 需要叠加小图标、环境较复杂的场景 |
这里的百分比只是便于理解的经验描述,不代表“二维码被盖住 30% 就一定能扫”。遮挡位置同样重要。定位图形、定时图形、格式信息等功能区域一旦受损,影响往往比随机损坏几个数据模块更大。
ToolExo 的二维码工具默认使用 M 级纠错,适合一般的链接、文本和静态分享场景。若二维码需要印在易磨损材质上,或者设计稿会覆盖中心区域,应使用支持更高纠错级别的生成方案,并在最终成品上实测扫码。
Reed-Solomon 之后,为什么还要“交织”
长内容生成的二维码,通常不会把全部原始数据放进一个连续数据块。规范会把数据拆分为多个块,每块分别计算 Reed-Solomon 纠错码,再将不同块的数据码字和纠错码字交织写入。
这样做的原因很实际。
假设二维码某一小片区域被划伤。如果数据按顺序连续存放,这道划痕可能集中破坏同一个数据块,导致该块的错误数超过可修复上限。交织后,连续区域中的错误会分散到多个块,每块承担的错误更少,成功恢复的概率更高。
这也是为什么二维码的纠错能力更接近“抵抗局部损坏”,而不是一份可以随意裁掉一角的图片。
矩阵中哪些格子不是业务数据
二维码里有不少模块并不承载用户输入的 URL 或文本。它们是扫描器定位和解码所需的结构。
常见功能区域包括:
- 三个定位图形:左上、右上、左下的大方框,用于识别位置、旋转和缩放;
- 分隔符:将定位图形与数据区隔开;
- 定时图形:横纵交替的黑白模块,用于推断网格间距;
- 对齐图形:版本较高时出现,帮助处理纸张弯曲或透视变形;
- 格式信息:记录纠错等级和掩码编号;
- 版本信息:版本 7 及以上会写入版本号;
- 静区:二维码四周必须保留的留白区域。
静区经常被忽略。二维码边缘紧贴海报边框、背景图案或其他文字时,手机可能无法判断图案从哪里开始。实际使用时,四周至少保留 4 个模块宽的空白区会更稳妥。
掩码不是加密,而是让图案更容易被扫
完成数据排布后,二维码还不能直接输出。因为原始数据可能恰好形成大面积连续黑块、连续白块,甚至类似定位图形的纹理。这些图案会增加识别难度。
标准二维码定义了 8 种掩码公式。生成器会依次尝试这些掩码,只对数据模块做黑白翻转,然后按照规则打分,选出分数最低的一种。
评分大致会检查四类问题:
- 同一行或同一列出现过长的连续黑白模块;
- 出现过多 2×2 的同色小方块;
- 出现类似定位图形的连续模式;
- 黑白模块比例偏离 50% 太多。
因此,掩码不会改变二维码承载的内容,也不是保护数据的安全措施。它解决的是视觉分布问题:让二维码更像一个方便机器识别的图案,而不是一片偶然生成的噪声。
同一段内容使用不同库、不同参数时,可能得到外观不同的二维码,但只要版本、纠错信息和数据解码一致,扫描结果可以相同。
一个 URL 最终会经历什么
假设输入的是:
https://example.com/docs?id=42
生成器通常会完成这些工作:
1. 将 URL 转成字节序列;
2. 写入编码模式和长度;
3. 根据容量选择版本;
4. 补终止位和填充字节;
5. 按块生成 Reed-Solomon 纠错码;
6. 交织数据码字与纠错码字;
7. 写入矩阵中的数据区域;
8. 计算 8 种掩码的罚分;
9. 写入最优掩码对应的格式信息;
10. 渲染为 SVG 或 PNG。
浏览器里看到的黑白方块,是这套编码流程的最终结果,不是文本内容的直接像素化。
生成二维码时几个容易踩的坑
二维码不是加密容器
二维码只是编码形式。把账号、口令、访问链接或内部信息转成二维码,并不会让内容变得不可读。任何扫描工具都可以尝试解析其中的文本。
分享 Wi-Fi 二维码时尤其要注意:二维码里的网络名称和密码通常可被扫码设备读取。只应为访客网络或明确允许分享的网络生成二维码。
纠错等级越高,容量越小
纠错码占用的空间越多,可用于存放业务数据的空间就越少。短链接通常没有问题,但长 URL、带大量参数的追踪链接、长文本或 vCard 内容可能让二维码迅速变密。
二维码过密后,即使理论上容量够用,低端摄像头、远距离扫描和印刷模糊也会影响识别。能缩短内容时,先缩短内容。
中间放 Logo 前先做成品测试
很多设计稿喜欢在二维码中心覆盖 Logo。高纠错等级可以提高容错空间,但不能替代测试。应在实际尺寸、实际纸张、实际光线下,用不同手机扫一遍。
特别是热敏打印、磨砂材质、金属反光和深色背景,常常比屏幕预览更难处理。
SVG 与 PNG 的使用场景不同
二维码用于网页、PPT 或固定像素尺寸的图片时,PNG 很方便。需要放大印刷、嵌入设计稿或交给印刷方时,SVG 更合适,因为它由矢量路径组成,缩放时不会出现位图锯齿。
不过,SVG 放大并不意味着二维码可以无限缩小印刷。模块物理尺寸太小,打印机和摄像头仍然可能无法稳定识别。
结语
二维码生成的难点不在于画出黑白格子,而在于把数据、纠错能力和视觉可识别性放进同一个矩阵。Reed-Solomon 负责在一定范围内修复错误,交织降低局部损坏的风险,掩码选择则避免生成难扫的图案。
实际使用时,先确认二维码内容是否需要公开,再控制内容长度,保留静区,并在最终载体上完成扫码测试。需要快速生成静态 URL、文本、邮箱、电话或 Wi-Fi 二维码时,可以使用 QR Code Generator 在浏览器本地生成并导出 PNG 或 SVG。