二维码是怎么存放信息的
二维码(QR Code)是日本电装波(Denso Wave)在1994年发明的二维条码,用一个由黑白小方格(模块)组成的正方形网格来记录数据。 三个角上的大方块叫定位图案,让扫描设备知道二维码的位置、大小和方向,所以从任何角度都能扫出来。 数据区里除了你的内容,还有里德-所罗门纠错码,因此二维码被弄脏、划伤或遮住一部分时,仍可能被还原。 内容会按模式打包:纯数字、字母数字(数字、大写字母、空格以及 $ % * + - . / : 共45个字符)或字节模式。 小写字母的网址和中文都走字节模式(UTF-8),其中一个汉字通常占3个字节。
二维码的尺寸不是随意的,共有40个版本:版本1是21×21个模块,每升一级,每边增加4个模块(每边模块数 = 17 + 4 × 版本),版本40为177×177。 内容越长、纠错等级越高,版本就越高,格子也越密。预览下方的统计会随输入显示当前的版本、模块数和字节数,你可以直观看到内容越短、格子越稀、越好扫。
这个二维码在哪里生成
二维码由本页自带的JavaScript二维码库在你的浏览器里绘制:浏览器算出模块矩阵,画到canvas上,你下载的PNG也是直接从这个canvas导出的。 你输入的网址、Wi-Fi密码、电话等内容,不会被发送到任何第三方二维码接口,也不会为了生成图片而上传到我们的服务器。 生成的是静态二维码:内容直接编码在图案中,没有有效期,中间也没有用于统计的跳转,即使本站不在了,已生成的码照样能扫。 代价是印出来后不能再改内容,也看不到扫描次数。如果需要事后更换目标地址或统计扫码量,就要用另外的“动态二维码”服务,它会在中间放一个自己的跳转。
纠错等级怎么选(L、M、Q、H)
纠错等级分四档,大致可恢复约7%、15%、25%、30%的损坏。等级越高越耐脏,但冗余占的空间越多,同样内容需要更高的版本,每个格子就更小。 下表是在版本40中放入单字节内容(如英文和网址)时各等级的最大字符数,是本页构建时用实际使用的库算出来的。
| 等级 | 大致恢复能力 | 最大字符数(单字节) | 最大字符数(3字节,如汉字) |
|---|---|---|---|
| L(低) | 约7% | 2,953 | 984 |
| M(中) | 约15% | 2,331 | 777 |
| Q(较高) | 约25% | 1,663 | 554 |
| H(高) | 约30% | 1,273 | 424 |
如果全是数字,还能放得更多:标准允许等级L最多7,089位数字,字母数字模式最多4,296个字符,但日常几乎用不到。选择时可以这样考虑:
- M(默认):屏幕展示或干净印刷的网址、Wi-Fi、名片,多数场景选它就够。
- L:内容较长且只在屏幕上显示、几乎不会受损时,格子少一些更易识别。
- Q、H:贴纸、包装、招牌等容易磨损污损的场合,或要在中间放小Logo时。Logo必须控制在可恢复范围内,不能盖住三个角的定位方块,并且一定要用多部真机实测。
“H最安全”是常见的误解。在打印尺寸固定时,同一个链接用H比用M的格子更小,所以在名片这类小面积上放长网址再用H,反而可能更难扫。 如果不担心损坏,缩短链接并使用M会更稳。
印刷尺寸多大合适
能否扫出来,取决于单个模块的实际大小和周围留白,而不是整体大小。标准要求四周至少留4个模块宽的空白,所以总宽度 = (模块数 + 8) × 单格大小,本工具保存的PNG也带有4格留白。 常见经验是二维码边长约为扫描距离的十分之一;普通纸张打印时,单格0.5毫米左右接近实用下限,0.8毫米以上比较从容(仅为经验值,与打印机、纸张、光线有关)。 下表按网址长度算出版本和含留白的总宽度。
| 网址长度 | M:版本/模块数 | M,0.5毫米 | M,0.8毫米 | H:版本/模块数 | H,0.8毫米 |
|---|---|---|---|---|---|
| 25字符 | v2 / 25×25 | 16.5毫米 | 26.4毫米 | v4 / 33×33 | 32.8毫米 |
| 50字符 | v4 / 33×33 | 20.5毫米 | 32.8毫米 | v6 / 41×41 | 39.2毫米 |
| 100字符 | v6 / 41×41 | 24.5毫米 | 39.2毫米 | v10 / 57×57 | 52.0毫米 |
| 200字符 | v10 / 57×57 | 32.5毫米 | 52.0毫米 | v15 / 77×77 | 68.0毫米 |
算例1:25个字符的网址用等级M,是版本2、25×25个模块。单格0.8毫米时,(25 + 8) × 0.8 = 26.4毫米见方,放在名片一角没问题。
算例2:200个字符的网址用等级M需要版本10、57×57个模块,同样0.8毫米时要 (57 + 8) × 0.8 = 52.0毫米。把链接缩短到50个字符,就降到版本4、32.8毫米。
算例3:100个字符的网址在等级M下是版本6(41×41),0.8毫米时为39.2毫米;同一链接改用等级H,变成版本10(57×57),需要52.0毫米。更强的容错是用更大的尺寸换来的。
用于印刷时请保存1024像素以上。把小PNG在排版软件里放大会让格子边缘发虚,而大图缩小则没有这个问题。
各类型的内容与注意事项
网址与文本
越短越好,多一个字符都可能让版本升高,没用的追踪参数请去掉。请以 https:// 开头;没有协议头时,有的扫描器只会当作普通文本而不提示打开链接(检测到时本工具会提醒)。 印刷品建议先指向你自己控制的短地址,再由它跳转到最终页面,这样以后目标变了也不用重印。印刷前,请至少用一部iPhone和一部安卓手机实际扫一遍样张。
Wi-Fi
内容采用通行的格式 WIFI:S:网络名;T:加密方式;P:密码;;。加密方式为 WPA(WPA2、WPA3网络一般也用这个值)、WEP,或无密码的 nopass;隐藏网络再加上 H:true;。 网络名或密码中如有 \ ; , : " 这些字符,要在前面加反斜杠,例如 Cafe;Guest 要写成 Cafe\;Guest,本工具会自动处理。 作为参照,WIFI:S:HomeWiFi;T:WPA;P:correct-horse-9;; 共41个字符,在等级L和M下是版本3(29×29),Q为版本4,H为版本5。 密码是以明文放在二维码里的,看到码的人都能读出密码,所以建议另设访客网络,公开张贴前要慎重。
联系人(vCard)
使用vCard 3.0格式(BEGIN:VCARD 到 END:VCARD),可放姓名、单位、电话、邮箱和网站,扫描后会提示添加到通讯录,适合名片。 字段越多版本越高、格子越密,所以只放必要的,或者只放一个指向详细信息页面的链接。不同手机和相机应用对vCard的显示方式略有差异,请在目标人群常用的设备上测试。
扫不出来时怎么排查
- 检查四周的白色留白(4格)有没有被裁掉,背景是否太花,与码混在一起。
- 保持深色模块、浅色背景的高对比度。黑白反色的码有些扫描器读不了,浅色或渐变会明显降低识别率。
- 看单格是否过小:缩短内容、降低纠错等级或放大印刷都能改善。
- 不要印在弧面、反光面或折痕处。
- 拍摄显示器上的二维码时,调整距离和亮度,屏幕刷新产生的条纹有时会导致失败。
生成之后怎么用
- 批量印刷前,先按实际尺寸打样,并在人们实际站的距离上试扫。
- 文档和幻灯片用512像素,海报、横幅用1024像素以上。
- 在二维码旁用文字再写一遍短网址,扫不了的人也能手动输入。
- Wi-Fi密码可以先用密码生成器生成,再来这里转成二维码。
常见问题
这里生成的二维码会过期吗?
不会。本工具把你输入的内容原样编码进图片,是静态二维码,没有有效期。不过如果码里的网址失效,或Wi-Fi密码改了,这个码当然也就没用了。
我的Wi-Fi密码会被发送到别处吗?
二维码在浏览器中生成,PNG也由页面上的canvas导出,不会把密码提交给二维码服务。但密码以明文存在于做好的图案里,任何能扫到这个码的人都能读出来。
可以在中间放Logo吗?
可以,因为纠错能还原被遮住的部分,但遮挡面积必须在可恢复范围之内(即便等级H也约为30%),且不能盖住三个角的方块。实际操作中Logo约占整体的十分之一,使用等级Q或H,并在多部手机上测试。
为什么放中文会让二维码变得很密?
中文以UTF-8字节存储,一个汉字约占3个字节,所以同样的字数比英文需要多得多的模块。例如“你好世界”4个字是12个字节。与其把长文直接放进去,不如放一个指向该文本页面的英文短链接,扫描更可靠。
一个二维码最多能放多少内容?
最大的版本40在等级L下约可放2,953个单字节字符,等级H约1,273个(见上表)。接近上限时格子极密、很难扫,实际使用建议网址控制在100个字符以内。
相关工具
- 密码生成器 - 生成用于Wi-Fi的高强度密码
- URL编码/解码 - 放入二维码前先对特殊字符做百分号编码
- Base64编码/解码 - 把文本转换成另一种表示
- UUID生成器 - 为每个链接生成唯一标识