二维码生成器

把网址、一段文字或一张 WiFi 配置串变成二维码,可选 L/M/Q/H 四个纠错等级、可调显示尺寸,生成后下载矢量 SVG,并给出这份内容实际用到的版本号、模块数与容量占用。

网址带上 https:// 扫码后能直接打开;内容越短二维码越疏,越容易在远距离和低分辨率下扫出来。
等级越高越耐污损,同一份内容占用的版本也越高。
静区固定 4 个模块,所以实际输出会略小于这里填的值。
版本v2
模块数25 × 25
内容字节(UTF-8)24
该等级容量 / 占用26 字节 / 92.3%

提示:内容框里按 Ctrl + Enter(macOS 用 Cmd + Enter)可以直接重新生成;Enter 本身留给换行,因为二维码内容经常是多行文本。尺寸框里按 Enter 也能立即重算。

使用方法

  1. 在「二维码内容」里填要编码的东西。默认示例是 https://www.liuquan.net/,共 24 个字符、24 个 UTF-8 字节。
  2. 选「纠错等级」。默认 M(标称可恢复约 15% 码字),适合日常印刷和屏幕展示;要贴 Logo 或可能被蹭花时改 Q 或 H。
  3. 设「显示尺寸」,默认 280 像素,允许 160~800。工具会反推每个模块占几个像素,并保证四周留出 4 个模块的静区。
  4. 点「生成二维码」。结果区会出现四个实测值:版本 v2、模块数 25 × 25、内容 24 字节、容量 26 字节(占用 92.3%)。
  5. 点「下载 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 像素。复算如下:

作为对比,内容 柳泉工具(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 容量校正图形
v121 × 2117 字节14 字节11 字节7 字节0 个
v225 × 2532 字节26 字节20 字节14 字节1 个
v329 × 2953 字节42 字节32 字节24 字节1 个
v433 × 3378 字节62 字节46 字节34 字节1 个
v537 × 37106 字节84 字节60 字节44 字节1 个
v641 × 41134 字节106 字节74 字节58 字节1 个
v745 × 45154 字节122 字节86 字节64 字节6 个
v849 × 49192 字节152 字节108 字节84 字节6 个
v953 × 53230 字节180 字节130 字节98 字节6 个
v1057 × 57271 字节213 字节151 字节119 字节6 个
v40177 × 1772953 字节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 位设备编号)走数字模式最划算,能比字节模式省掉一半以上格子。

输入范围、边界与精度说明

常见问题

为什么我填 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 会带一段内容摘要,编码库已对 < > & " 做了实体转义,不会破坏页面结构。

相关工具