二维码生成详解:QR 码为什么能扫还能纠错
QR 码不只是”黑白方块”
QR(Quick Response)码由日本 Denso Wave 公司的原昌宏于 1994 年发明,最初是为汽车零件追踪设计的。相比传统一维条形码(只能存几十个字符、需直线对准扫描),QR 码能存上千字符、任意角度可扫、还自带纠错——这就是”Quick Response”的由来。
二维码生成器看似只是”输入文字出图片”,但背后是一套精密的编码结构。理解它的结构,你才能用好”版本""纠错等级""容量”这些参数。
QR 码的结构
一个 QR 码由功能区和数据区两部分拼成:
功能图案(定位用)
- 三个定位图案(Finder Pattern):左上、右上、左下三个大方块(7×7 的”回”字)。这是 QR 码最显眼的特征,让扫描器快速找到码的方向和边界。三个角放定位图案,第四个角不放,是为了让扫描器能判断旋转方向
- 对齐图案(Alignment Pattern):较大的码(版本 2 以上)中间散布的小方块,用于纠正码面扭曲。版本越高对齐图案越多
- 定时图案(Timing Pattern):定位图案之间的黑白相间线,提供模块坐标参考
- 格式信息:记录纠错等级和掩码图案,存在定位图案旁边
数据区
剩下的区域才是真正存数据的地方——黑白模块按编码规则填充,加上纠错码。还有一块安静区(Quiet Zone):码四周至少 4 模块宽的空白边框,帮助扫描器识别边界,生成时千万别裁掉。
编码流程:从文字到方块
把文本变成 QR 码方块要经过几步:
- 数据编码:把文本转成二进制位流。QR 支持多种编码模式——数字模式(最省,每 3 位数字用 10 位)、字母数字模式、字节模式(中文等用 UTF-8)、汉字模式。生成器会自动选最优模式,数字比中文省很多空间
- 追加纠错码:用 Reed-Solomon 纠错算法给数据加冗余位
- 交错与填充:把数据和纠错码按规则交错排列(避免局部损坏导致连续数据丢失),填到目标版本对应的矩阵大小
- 掩码(Masking):对数据区做 8 种掩码图案之一异或,避免出现大面积同色块(同色块会干扰扫描器定位)。生成器会评估 8 种掩码选最优的
- 放置功能图案与格式信息:完成矩阵
纠错机制:Reed-Solomon
QR 码最聪明的设计是纠错码。即使码面被遮挡、污损、撕裂一部分,仍能完整恢复数据——靠的就是 Reed-Solomon 纠错。
Reed-Solomon 是一种基于伽罗华域的纠错编码,原理是给原始数据附加一组冗余校验位。它的特性是:只要损坏的部分不超过纠错能力上限,就能完整恢复。QR 码定义了四个纠错等级:
| 等级 | 纠错能力(可恢复数据比例) | 典型用途 |
|---|---|---|
| L (Low) | ~7% | 码面干净、空间优先 |
| M (Medium) | ~15% | 默认,平衡 |
| Q (Quartile) | ~25% | 可能有轻度遮挡 |
| H (High) | ~30% | 重度遮挡环境(如印在产品上、加 logo) |
纠错等级越高,纠错码占的空间越大,能存的实际数据越少。所以”容量”不是固定的——同一版本下,L 级容量最大,H 级最小。
实战意义:如果二维码要中间加 logo、或贴在易磨损的地方,选 H 级——它能容忍中央被 logo 覆盖约 30% 面积仍可扫。如果只是干净网页放个 URL,M 级足够。加 logo 不是免费午餐,必须配套提高纠错等级,否则扫不出来。
版本与容量
QR 码有 40 个版本(Version 1~40),版本越高矩阵越大:
- 版本 1:21×21 模块
- 版本 N:(17 + 4N)×(17 + 4N) 模块
- 版本 40:177×177 模块
版本越大能存越多。最大容量(版本 40、L 级、数字模式)约 7000 个数字或 2900 个汉字。但实际能用多少取决于三个变量:
- 数据类型:数字最省、英文次之、中文(字节模式)最费
- 纠错等级:越高容量越小
- 版本:越大容量越大
生成器通常”按需自动选版本”——你输入数据,它算出能装下的最小版本,保持码面尽量小。所以你不用手动选版本,但要知道数据量太大时码面会变大、变密,扫描难度上升。
容量与可扫性的平衡
很多人犯的错:往 QR 码塞超长 URL(带一堆 UTM 参数),结果码面密密麻麻,手机难扫。解决思路:
- 用短链:长 URL 先转短链再生成 QR,码面小且易扫
- 控制数据量:QR 码不是越满越好,密度越高对扫描器要求越高、对污损越敏感
- 足够分辨率:码面打印尺寸 = 模块数 × 每模块物理尺寸。模块越多需要的最小打印尺寸越大,否则扫描器分辨不清
特殊 QR 内容
QR 码内容不是纯文本时,扫描器会按格式识别执行特殊动作:
- URL(
https://...):打开浏览器 - WiFi(
WIFI:S:名称;T:WPA;P:密码;;):手机提示连接 WiFi - vCard:保存为联系人
- mailto:/tel::发邮件/拨号
生成 WiFi 二维码是实用场景——客人扫码直接连 WiFi,不用输密码。这些格式都是约定俗成的文本协议,QR 码本身只负责存文本,识别动作由扫描 App 完成。
小结
QR 码的核心设计是”定位图案 + 数据编码 + Reed-Solomon 纠错 + 掩码”。定位图案让任意角度可扫,纠错码让部分损坏可恢复,掩码避免同色块干扰。理解版本/容量/纠错等级三者的权衡,你就能正确选择:干净场景用低纠错换大容量,易损场景用高纠错保可读性。要反向从图片识别 QR 码,看 [[qr-decode]]。