二维码不是「内容随便塞、越大越清楚」——它有一套硬性规格:容量由版本决定,容错由纠错等级决定,能不能扫出来由印刷尺寸与静区决定。
不管是做桌牌还是印海报,在线二维码生成之前先弄清这三组数字,能省掉一次重新印刷的钱。这篇把三组数字讲清楚,最后给一份「扫不出来时怎么排查」的清单。
👉 在线二维码生成(免登录,可调纠错等级与颜色) —— 支持 PNG / SVG 下载,输入什么都不会传服务器
一、在线二维码生成的容量上限:版本说了算
二维码的「版本」就是尺寸等级,模块数 = 17 + 4 × 版本:版本 1 是 21×21,版本 40 是 177×177。市面上绝大多数生成器(包括上面的工具)都是按内容自动选最小版本,所以你不用手动选——但要知道内容变长时版本会跳,点阵会变密。
容量还取决于编码模式:纯数字最省、大写字母数字次之、字节(含小写字母、符号、UTF-8 中文)最费。下面是自动生成模式下(即版本 40)四类内容的上限:
| 内容模式 | L 约 7% | M 约 15% | Q 约 25% | H 约 30% |
|---|---|---|---|---|
| 纯数字 | 7089 | 5596 | 3993 | 3057 |
| 大写字母 + 数字 + 少量符号 | 4296 | 3391 | 2420 | 1852 |
| 字节(小写字母 / 符号 / UTF-8) | 2953 | 2331 | 1663 | 1273 |
| 中文(UTF-8,3 字节 / 字) | 约 984 | 约 777 | 约 554 | 约 424 |
关于中文要特别说明:二维码规范里的「汉字模式」是按 Shift-JIS 双字节设计的,中文在 UTF-8 下是 3 字节,所以实际按字节模式算更保险——上表的中文字数就是「字节数 ÷ 3」取整得来的,属于保守值。
只要内容里混进一个小写字母或中文,整段就会退到字节模式,数字和 URL 的容量优势会一起失效。
再看不同版本能装多少(以 M 级、字节模式为例):
| 版本 | 模块数 | 字节 | 约合中文 | 典型场景 |
|---|---|---|---|---|
| 1 | 21×21 | 14 | 4 字 | 极短编号 |
| 5 | 37×37 | 84 | 28 字 | 短网址、短文本 |
| 10 | 57×57 | 213 | 71 字 | 带参数的 URL |
| 20 | 97×97 | 666 | 222 字 | 一段说明文字 |
| 30 | 137×137 | 1370 | 456 字 | 长文本、配置串 |
| 40 | 177×177 | 2331 | 777 字 | 上限,已很难扫 |
所以「把整段商品介绍塞进二维码」是个坏主意:到版本 30 以上点阵已经密到需要很好的摄像头和很近的距离才扫得动。正确做法是把长内容放到网页上,二维码里只放一个短链接。
二、纠错等级 L / M / Q / H 选哪个
纠错等级表示「最多能有多大面积被遮挡/污损,仍可还原」,四个档位对应约 7% / 15% / 25% / 30%。
- L(约 7%):屏幕显示、电子屏投放、干净环境。容量最大,点最疏
- M(约 15%):默认选择,绝大多数场景够用
- Q(约 25%):可能沾灰、有磨损的贴纸;二维码上要压印图案
- H(约 30%):要在正中间放 Logo、或户外日晒雨淋
代价是容量:从 L 提到 H,字节容量从 2953 掉到 1273,只剩 43%(不到一半)。内容长度不变的情况下,提高纠错等级会让版本变大、点更密,反而更难扫。所以不要无脑选 H。
要在中间放 Logo 的三条规矩:
- 纠错等级至少提到 H,这是给被遮挡区域的冗余
- Logo 边长不超过二维码的 20%(最多别超过 25%),且放在正中心
- Logo 边缘留白,别和码点直接相接;放完必须用 2-3 台不同手机实扫验证
纠错不是万能的:遮挡面积超过该等级上限,再高的等级也扫不出来。
三、印刷尺寸的经验公式
二维码能不能扫出来,取决于单个模块的物理尺寸,不是图片像素有多大。两条经验规则取较严者:
最小边长 = max(模块数 × 单模块最小尺寸, 扫码距离 / 10)
单模块最小尺寸:普通喷墨/胶印取 0.4mm,激光打印可到 0.3mm
扫码距离 / 10:手机贴近扫(30cm)→ 3cm;隔一米扫 → 10cm
举例:一个 30 字符的短链,M 级大约落在版本 3(29×29)。按模块算 29 × 0.4mm ≈ 1.2cm,按距离算 30cm / 10 = 3cm,取 3cm。如果你做成 1.5cm 的小贴纸,理论上勉强够,实际上隔着塑封膜就扫不动了。
反过来,版本 40(177 模块)按 0.4mm 算需要 7cm 以上的边长——这就是为什么超长内容生成的码在名片上根本扫不出来。
印刷还要注意三件事:
- 静区(Quiet Zone)留 4 个模块:码最外圈到图案边缘必须有空白,规范是 4 个模块宽。上面工具的「边距」参数默认 2,用于印刷时建议调到 4;设计稿里别让边框、底色、文字压到这块区域
- 别反色:黑底白码(反色)有一部分扫码枪和老旧识别库认不出来,微信/支付宝多数能认。对外张贴一律用深色码 + 浅色底
- 对比度要够:前景色别用浅灰、浅黄、淡蓝,和背景的明度差越大越稳。工具里的前景色/背景色可以调,但调完务必实扫一遍
导出时优先下载 SVG(矢量,放大到海报也不失真)或把尺寸拉到 600px 再下载 PNG;位图一旦按小尺寸导出,放大印刷只会模糊。
四、WiFi 二维码格式与常用内容格式
WiFi 二维码是标准格式,手机相机扫到后会直接弹「加入网络」:
WIFI:T:WPA;S:Office-5G;P:Passw0rd!;;
WIFI:T:nopass;S:Guest-Free-WiFi;;
WIFI:T:WPA;S:Office-5G;P:Passw0rd!;H:true;; # H:true 表示隐藏网络
三个必须注意的点:
- 结尾是两个分号
;; T:取值是WPA/WEP/nopass(WPA2/WPA3 都写WPA,不要写WPA2)- SSID 或密码里含
\;,:"时要用反斜杠转义(\;\:\,),否则会被截断,扫出来密码是错的
// node-qrcode(本工具用的就是这个库)的典型参数
import QRCode from 'qrcode'
await QRCode.toCanvas(canvas, 'https://it997.com', {
width: 300, // 导出像素,不是物理尺寸
margin: 4, // 静区,印刷用 4
errorCorrectionLevel: 'H',
color: { dark: '#0f172a', light: '#ffffff' }
})
其他常用格式:网址直接写完整 https://;电话 tel:+8613800000000;短信 SMSTO:13800000000:内容;邮件 mailto:a@b.com;名片用 vCard(BEGIN:VCARD 开头,注意 vCard 很长,中文名片建议提到 Q 级并做实扫验证)。
五、二维码不会过期,动态二维码其实是短链
二维码本身没有有效期。 码里写的就是一段字符串,把它打印下来放十年,扫出来的还是那串字符——它不会「失效」,也不会「过期」。
所谓「动态二维码」,是把一个短链接写进码里,跳转目标由服务器控制。你看到的「这个码过期了」,过期的是背后的短链服务或活动页面(也可能是服务商停了、欠费了、域名换了)。
这条推论很重要:
- 别把二维码当权限控制。码一旦被拍走,就等于把里面的内容(URL、密码、口令)公开了。门禁、付款、登录这类场景,必须靠后端的一次性 token + 有效期,不能指望「码不外传」
- 改内容不改码:内容会变(菜单、活动页、收款账号)就用短链方案,别每年重印
- 定期检查张贴出去的码:确认跳转目标还在、没被换
六、扫码的安全问题
扫码这个动作本身是「盲跳」——你不知道目标地址就开始访问了。常见的风险:
- 覆盖贴码:诈骗者在商家收款码上贴一张自己的码。张贴类二维码建议用防撕贴纸或定期核对外观
- 跳转钓鱼:码里是短链,先跳到一个仿冒登录页。手机相机一般会预览最终域名,扫之前看一眼域名,短链看不到最终地址的,先别填任何信息
- 诱导安装 / 自动下载:扫码后跳到 APK 下载页或要求授权,一律拒绝
- WiFi 码:扫码即连,等于把网络凭据明文贴出去——访客网络可以用,内网 SSID 别这么干
七、扫不出来时的排错清单
| 现象 | 最可能的原因 | 处理办法 |
|---|---|---|
| 完全扫不出 | 静区被裁掉 / 边缘被文字压住 | 边距设 4,四周留白,别让底色紧贴码点 |
| 要贴很近才扫得出 | 模块太密或尺寸太小 | 缩短内容降版本,或按公式放大尺寸 |
| 放了 Logo 后扫不出 | 遮挡超过纠错能力 | 提到 H 级,Logo 缩到 20% 以内 |
| 打印出来糊了 | 用了小尺寸位图放大 | 下载 SVG,或把尺寸拉到 600px 再导出 PNG |
| 有的手机能扫有的不能 | 版本过高 + 低端摄像头 | 缩短内容,控制在版本 10 以内 |
| 反色码扫不出 | 部分扫码枪不支持反色 | 改回深色码 + 浅色底 |
| 彩色码识别慢 | 前景/背景明度差不足 | 加大对比度,别用浅色系前景 |
| WiFi 连不上 / 密码错 | 特殊字符未转义 | ; : , \ 前加反斜杠 |
| 扫码跳转的页面不对 | 内容被截断或含不可见字符 | 用 Base64 编解码 检查原始字符串,确认没有多余空格换行 |
| 生成时直接报错 | 内容超出所选模式的容量 | 缩短文本,或改成短链再生成 |
相关工具:在线二维码生成|Base64 编解码|时间戳转换
全部纯前端实现,输入的内容不上传服务器。