使用方法
- 在「二维码内容」里填要编码的东西。默认示例是
https://www.liuquan.net/,共 24 个字符、24 个 UTF-8 字节。 - 选「纠错等级」。默认 M(标称可恢复约 15% 码字),适合日常印刷和屏幕展示;要贴 Logo 或可能被蹭花时改 Q 或 H。
- 设「显示尺寸」,默认 280 像素,允许 160~800。工具会反推每个模块占几个像素,并保证四周留出 4 个模块的静区。
- 点「生成二维码」。结果区会出现四个实测值:版本 v2、模块数 25 × 25、内容 24 字节、容量 26 字节(占用 92.3%)。
- 点「下载 SVG」存成矢量文件,或点「复制 SVG 代码」把图形直接粘进网页。印刷前请用两台不同手机各实扫一次。
这个二维码生成器能解决什么问题
一是把长网址变成可扫的图形。纸质物料上的链接只能靠二维码承载,而链接里一旦带追踪参数就会很长,本页会直接告诉你当前内容落在哪个版本、还差多少字节就要升一版。
二是判断「为什么这个码扫不出来」。扫描失败最常见的原因不是内容错,而是模块太小、静区被裁掉、对比度不足。本页把静区固定成 4 个模块并给出实际输出边长,方便排版时预留位置。
三是在耐污损和可扫性之间做取舍。同一份内容用 Q 或 H 会多占一到两个版本、模块更密,对照表把「升级能换来多少抗损能力、代价是多少字节」摆在一起,不用猜。
四是给网页和印刷出矢量文件。SVG 放大不糊,也能直接内联进 HTML,不产生额外图片请求。
本页不做这些事:不在二维码中间嵌 Logo(要按模块数算遮挡面积,请用「二维码生成器(带Logo)」);不生成 WIFI: 与 BEGIN:VCARD 这类专用报文(请用 WiFi 与 vCard 两个专门页);也不做反向识图,要把印出来的二维码读回内容请用「二维码代码读取上传」。
生成原理:版本、纠错等级与掩码
本页编码由站点自带的 qrcode.js 完成,入口是 qrcode(typeNumber, errorCorrectionLevel),随后依次调用 addData(内容, 'Byte') 与 make(),规则来自 ISO/IEC 18004(QR Code 码制规范)。这个二维码生成器把三件事显式暴露给用户:版本、纠错等级、显示尺寸。
版本决定矩阵有多大。标准把符号分成 40 个版本,模块数 = 4 × 版本 + 17:版本 1 是 21 × 21,版本 2 是 25 × 25,每升一版单边多 4 个模块,版本 40 是 177 × 177。传 typeNumber = 0 时库会从版本 1 起逐个试算,选第一个装得下的版本,所以同样的内容加几个字符就可能让边长跳 4 个模块。
纠错等级决定能坏多少还能读。标准给出四档标称恢复能力:L 约 7%、M 约 15%、Q 约 25%、H 约 30%,指在保持完整解码的前提下可丢失的码字比例。实现方式是 Reed–Solomon 纠错:把数据码字切成若干块,每块按等级追加固定数量的纠错码字,再把各块交错(interleave)铺进矩阵。版本 1 总共只有 26 个码字,L/M/Q/H 的数据码字分别是 19/16/13/9,纠错码字是 7/10/13/17;版本 40 总共 3706 个码字,四个等级分别切成 25/49/68/81 块。
掩码是为了不让图形自己骗自己。数据铺完后,标准用 8 种固定图案(编号 000 到 111)分别与数据区异或,再按四个惩罚项打分:N1 罚连续同色(连续 5 个同色模块起扣,超出部分每个加 1 分,系数 3),N2 罚大片同色(每个 2 × 2 同色块扣 3 分),N3 罚长得像定位图形的 1:1:3:1:1 条纹(每次重扣 40 分),N4 罚深浅失衡(偏离 50% 每 5 个百分点扣 10 分)。总分最低的一张胜出,编号写进 15 位格式信息(5 位数据 + 10 位 BCH),扫描器读出来就知道该用哪张掩码还原;版本 7 及以上还会额外写入 18 位版本信息(6 位数据 + 12 位 BCH)。
静区为什么是 4 个模块。ISO/IEC 18004 要求符号四周留出 4 个模块宽的空白区,让扫描器先靠一条贯穿定位图形的参考线确定模块尺寸与二值化阈值,再开始采样。这里有个常见的坑:编码库的 createSvgTag(cellSize, margin) 里 margin 单位是像素而不是模块,默认值恰好等于 cellSize × 4。若把 margin 写成常数 4,单元格 8 像素时就只剩 0.5 个模块静区,贴到深色背景上极易扫不出。本页因此显式传 cell × 4。
中文按 UTF-8 走字节模式。标准定义了数字、字母数字、字节、汉字四种编码模式;本站统一用字节模式承载 UTF-8 字节流,一个汉字占 3 个字节、一个 emoji 占 4 个字节,容量要按字节而不是字符数对表。
完整示例(数值仅作演示)
示例条件与页面默认值一致:内容 https://www.liuquan.net/、纠错等级 M、显示尺寸 280 像素。复算如下:
- 内容 24 个字符,全为 ASCII,UTF-8 编码后仍是 24 字节;
- M 级下版本 1 装 14 字节、版本 2 装 26 字节,24 落在两者之间,所以自动选到 版本 2;
- 版本 2 的模块数 = 4 × 2 + 17 = 25 × 25;
- 容量占用 = 24 ÷ 26 = 92.3%,再加 3 个字节就会升到版本 3(29 × 29);
- 单元格像素 = ⌊280 ÷ (25 + 8)⌋ = 8 像素,静区 = 8 × 4 = 32 像素,实际输出边长 = 25 × 8 + 32 × 2 = 264 像素,比请求的 280 略小;
- 同样内容换成 Q 或 H,容量掉到 20 与 14 字节,装不下 24 字节,版本会升到 版本 3(29 × 29)。
作为对比,内容 柳泉工具(4 个汉字 = 12 字节)在 M 级下能塞进最小的版本 1(容量 14 字节,21 × 21 模块);而一条 WIFI:T=WPA;S:MyHome;P=12345678;; 是 32 字节,M 级下要升到版本 3。中文串的容量焦虑远大于英文网址。
版本、字符容量与纠错等级对照表
下表是 GB 与 ISO/IEC 18004 一致的字节模式容量。四列分别对应 L/M/Q/H 四个纠错等级,单位是 UTF-8 字节;「模块数」按 4 × 版本 + 17 计算。本页工具里显示的容量值就取自这张表。
| 版本 | 模块数 | L 容量 | M 容量 | Q 容量 | H 容量 | 校正图形 |
|---|---|---|---|---|---|---|
| v1 | 21 × 21 | 17 字节 | 14 字节 | 11 字节 | 7 字节 | 0 个 |
| v2 | 25 × 25 | 32 字节 | 26 字节 | 20 字节 | 14 字节 | 1 个 |
| v3 | 29 × 29 | 53 字节 | 42 字节 | 32 字节 | 24 字节 | 1 个 |
| v4 | 33 × 33 | 78 字节 | 62 字节 | 46 字节 | 34 字节 | 1 个 |
| v5 | 37 × 37 | 106 字节 | 84 字节 | 60 字节 | 44 字节 | 1 个 |
| v6 | 41 × 41 | 134 字节 | 106 字节 | 74 字节 | 58 字节 | 1 个 |
| v7 | 45 × 45 | 154 字节 | 122 字节 | 86 字节 | 64 字节 | 6 个 |
| v8 | 49 × 49 | 192 字节 | 152 字节 | 108 字节 | 84 字节 | 6 个 |
| v9 | 53 × 53 | 230 字节 | 180 字节 | 130 字节 | 98 字节 | 6 个 |
| v10 | 57 × 57 | 271 字节 | 213 字节 | 151 字节 | 119 字节 | 6 个 |
| v40 | 177 × 177 | 2953 字节 | 2331 字节 | 1663 字节 | 1273 字节 | 46 个 |
四个等级的标称纠错容量与容量代价对照如下。「标称」是因为 Reed–Solomon 按码字纠正,可恢复比例会随版本在 7%~30% 之间浮动,标准给的是工程上够用的近似值。
| 等级 | 标称可恢复码字 | 版本 1 结构 | 适用场景 |
|---|---|---|---|
| L | 约 7% | 数据 19 + 纠错 7 = 26 | 屏幕展示、内容很长、环境干净 |
| M | 约 15% | 数据 16 + 纠错 10 = 26 | 日常印刷与网页,最常见的默认档 |
| Q | 约 25% | 数据 13 + 纠错 13 = 26 | 包装、贴纸、彩色或较密的排版 |
| H | 约 30% | 数据 9 + 纠错 17 = 26 | 户外、易磨损、要嵌小图标 |
换成数字或字母数字模式,同尺寸能装的字符多得多。以最大的版本 40 配 L 级为例:数字模式 7089 个字符,字母数字模式(大写 A–Z、0–9 与 $%*+-./: 和空格,共 45 个)4296 个,字节模式 2953 个,日文汉字模式 1817 个。纯数字内容(例如 18 位设备编号)走数字模式最划算,能比字节模式省掉一半以上格子。
输入范围、边界与精度说明
- 内容上限 1200 字符(
maxlength,按 UTF-16 码元计),同时还要过 UTF-8 字节关。M 级下版本 40 最多装 2331 字节,即纯中文约 777 个字。超限时页面会告诉你:当前等级上限多少字节、你填了多少字节、差多少。 - 显示尺寸 160~800 像素、步长 20。这个数字不是最终边长。工具先算
单元格像素 = ⌊尺寸 ÷ (模块数 + 8)⌋(加 8 是因为左右各留 4 个模块静区),再取最小值 2 像素,最后输出边长 =模块数 × 单元格 + 静区 × 2。所以填 280 得到 264、填 200 得到 198,属于正常现象。 - 静区永远按 4 个模块算,不按 4 个像素算。这是本页与不少在线生成器最容易出现差异的一处:把静区写成 4 像素时,单元格越大静区占比越小,贴到深色底或裁边后就难以识别。
- 版本自动取最小可容纳值,不能手动指定。这样同一份内容每次生成的版本一致;若希望固定版本(例如统一印刷尺寸),缩短内容比强行指定更可靠。
- 字节数按 UTF-8 计。一个 ASCII 字符 1 字节、一个常用汉字 3 字节、一个补充平面字符(生僻字、emoji)4 字节,与
TextEncoder().encode()的长度一致。 - 不要把长网址直接塞进来。URL 里的
&、?、=和追踪参数会让内容迅速膨胀,模块越密对印刷精度要求越高。短链接能显著减小版本,但有失效风险,长期物料建议用自有域名跳转。 - 印刷别只按屏幕看。模块实际打印尺寸低于 0.4 毫米时普通家用打印机几乎扫不出来,一般要求模块边长不小于 0.5 毫米,静区之外的留白也要算进版面。
- 生成过程没有任何网络请求。编码、掩码评分、SVG 拼接都在当前页面完成,可在开发者工具的 Network 面板自查。
常见问题
为什么我填 280 像素,下载的 SVG 边长却是 264?
因为尺寸只是上限。工具把可用宽度按「模块数 + 8」等分后向下取整得到单元格像素:版本 2 的 25 个模块加上左右各 4 个模块静区正好是 33 份,280 ÷ 33 取整得 8 像素,于是 25 × 8 + 8 × 4 × 2 = 264。要正好占满目标宽度,把尺寸调高一档,或者让排版软件自己缩放矢量文件即可。
纠错等级选 M 还是 H?
先问三件事:会不会被遮挡或磨损、印出来多大、内容有多长。屏幕展示和普通文档用 M 就够;贴在设备外壳、会被反复触摸的位置用 H。等级越高越抗损,代价是同一份内容多占一到两个版本、模块更密,小尺寸印刷时反而更难扫出——抗损能力和可读性在这里是反向的。
为什么加几个字,二维码就明显变密了?
因为版本是离散跳变的。M 级容量从版本 1 的 14 字节直接跳到版本 2 的 26 字节,模块总数从 441 涨到 625。只要跨过一个版本门槛,图形就整体变密一档。示例里的 24 字节距版本 2 上限只剩 2 字节,再加一个汉字就得升到版本 3。
二维码中间能放 Logo 吗?
本页不做遮挡,因为能不能放取决于遮挡面积:H 级标称可恢复约 30% 的码字,而 Logo 盖住的是一个连续区块,区块里深色模块只占一半,要按「遮挡面积 × 深色比例」估算,还要给扫描器的定位环节留余量。需要嵌图标请用带 Logo 的专门页面。
中文内容为什么比英文占地方?
本页统一走字节模式,编码是 UTF-8:ASCII 字符 1 字节,常用汉字 3 字节,emoji 或生僻字 4 字节。同样 10 个字,中文要 30 字节,英文只要 10 字节左右。标准里还有按 Shift JIS 两字节一个汉字的汉字模式,但只覆盖日文汉字集,对简体中文并不通用,本页没有采用。
生成的二维码会过期或者被远程修改吗?
都不会。二维码是把内容直接编码进矩阵的,不含任何服务器地址,所以图形不会失效,内容也不会被人远程替换。会「变」的只有内容里那个网址本身——它指向的页面被删或跳转改了,扫码后就打不开或跳到别处,这也是不建议长期物料上用第三方短链的原因。
为什么下载的是 SVG 而不是 PNG?
SVG 记录的是每个模块的坐标而不是像素,放大到海报尺寸也不糊,文件通常只有几 KB,还能直接内联进 HTML 省掉一次图片请求。需要位图时,把 SVG 导入设计软件后按目标像素导出即可,比先导 PNG 再放大清晰得多。
内容里带引号、换行或者特殊符号会出错吗?
不会。内容按字节模式原样编码,换行符也会如实写进数据流。只需留意两点:一是「字母数字」模式不接受小写字母和多数符号,本站固定用字节模式所以不受影响;二是 SVG 的 title 与 description 会带一段内容摘要,编码库已对 < > & " 做了实体转义,不会破坏页面结构。
相关工具
- 二维码生成器(带Logo):按模块数算安全遮挡尺寸,把图标嵌进码心。
- WiFi二维码代码生成器:生成
WIFI:报文,扫码直接连网。 - vCard二维码代码生成器:把姓名电话写成电子名片,扫码存进通讯录。
- 二维码代码读取上传:把印出来的码图传上来,读回里面的内容。
- 条形码生成器:面向 EAN、Code128 这类一维码。
- UUID生成器:给每个二维码配一个不重复的编号。
- 生成器:查看全部生成器工具。