关于 二维码生成与识别
二维码生成与识别工具可以把任意文本变成可下载的二维码图片,也能从你上传、粘贴或用摄像头对准的图像里把内容读回来。生成的结果固定是 640 × 640 像素的 PNG,纠错等级为 M——绝大多数印刷和屏幕二维码用的就是这一档。
二维码只是一个装字符串的容器,仅此而已。手机会对某些前缀做特殊处理,所以 https:// 会打开浏览器、WIFI: 会提示连接网络,但二维码本身并不知道自己装的是什么。决定它能否被扫出来的是两个属性:版本,也就是编码器为容纳内容而选定的模块网格;以及纠错等级,它用容量换取在破损情况下仍能读出的能力。内容越多网格越密,网格越密就越要印得大。
如何使用这个开发者工具
- 选择「生成」来制作二维码,或选择「识别」来读取二维码。
- 生成模式下,输入或粘贴要编码的确切字符串(链接要带协议头),执行后下载 PNG。
- 识别模式下,可以上传图片文件、把截图直接粘贴到结果框,或者打开摄像头。
- 在采取任何行动之前先读一遍结果框里的文本,尤其是要打开一个不是你自己生成的二维码里的链接时。
- 把下载的 PNG 印刷或嵌入时,尺寸要保证模块边缘清晰,并在四周留出空白。
实例:一个 Wi-Fi 连接码
Wi-Fi 载荷格式要求对分隔符做转义,这正是大多数手写示例翻车的地方。这个密码里就含有一个分号。
WIFI:T:WPA;S:Guest-5G;P:tr0ub4dor\;3;;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAKAC…
640 × 640 PNG,Data URL 共 5,198 个字符
QR 版本 3,29 × 29 模块,纠错等级 M密码里分号前的反斜杠是必须的;少了它,手机上的解析器会提前结束密码字段,网络自然连不上。Wi-Fi 载荷中的反斜杠、逗号、冒号和引号也要按同样的方式转义。
纠错等级与最大容量
容量数字对应版本 40,也就是最大的网格。本生成器固定使用 M 档;其余几行说明换到别处重新编码时会得失什么。
| 等级 | 可恢复破损 | 数字 | 字母数字 | 字节 |
|---|---|---|---|---|
| L | 约 7% | 7,089 | 4,296 | 2,953 |
| M(本工具使用) | 约 15% | 5,596 | 3,391 | 2,331 |
| Q | 约 25% | 3,993 | 2,420 | 1,663 |
| H | 约 30% | 3,057 | 1,852 | 1,273 |
常见问题排查
点摄像头按钮,提示摄像头不可用。
成因 实时扫描依赖浏览器的条码检测 API,它在桌面端和 Android 上的 Chromium 系浏览器可用,Safari 和 Firefox 则没有。此外摄像头还要求安全上下文和用户授权。
解决办法 拍张照或截个图,用上传按钮处理,或者把图片直接粘进结果框。文件识别在所有浏览器里都能用,因为它跑在 canvas 上。
内容一长就生成失败。
成因 在 M 档下,最大的二维码只能装 2,331 字节。超过之后没有任何版本放得下,编码器会直接报错而不是截断内容。
解决办法 把载荷缩短。用短链替换冗长的追踪 URL,删掉多余的查询参数,并记住非 ASCII 字符每个要占 2 到 4 字节。
文件看着没问题,印出来却扫不动。
成因 内容变长会抬高版本,同样的物理尺寸里就要塞进更多、更小的模块。另外本生成器留的静区是 2 个模块,而规范建议 4 个。
解决办法 印得更大一些,或把内容缩短让网格变粗;排版时再在图片四周额外留出白边。
拍下来的二维码识别不出来。
成因 解码器需要完整的图形,包括静区,并且要有足够的对比度和清晰度。反光、运动模糊、被裁掉一角的定位图案,以及拍屏幕产生的摩尔纹,都会让识别失败。
解决办法 把图片裁到二维码加一圈留白,别斜着拍屏幕;内容本来就在屏幕上时,优先用截图而不是拍照。
扫出来的链接打开了错误页面,或者根本打不开。
成因 二维码装的是原始文本,所以含空格或非 ASCII 字符的 URL 会被原样交给浏览器,而各家扫码 App 的「修复」策略并不一致。
解决办法 生成前先用 URL 编码工具做百分号编码,并带上协议头;以 www. 开头的字符串常常会被当成纯文本而不是链接。
适合用这个工具的场景
- 把预发布地址、设备配对串或长令牌交给手机,免去手动输入。
- 为消费这些格式的 App 构造 Wi-Fi、vCard 或 otpauth 测试载荷。
- 在按下之前,先看清海报、发票或包裹上的二维码到底装了什么。
- 为幻灯片、README 或印刷排版产出一张 PNG。
应该换用别的工具的场景
- 其他条码制式。这里只识别 QR,不支持 EAN、Code 128 等商品条码,也不支持 Data Matrix、PDF417、Aztec。
- 分发机密。任何能拍到这张码的人都拿到了内容,包括你身后的人。
- 统计扫码次数或事后更换落地页。生成出来的码是静态的,这类需求需要你自己掌控的跳转服务。
隐私与数据处理
生成、图片识别和摄像头帧处理全部在当前浏览器标签页内完成:图像被画到 canvas 上就地分析,图片和识别出的字符串都不会上传。摄像头只有在你按下按钮后才会启动,再次点击或离开页面时即关闭。二维码是一种公开编码,请把放进去的任何内容都视为「镜头能拍到的人都能读到」。
相关开发者工具
常见问题
二维码里的内容是保密的吗?
不是。它是一种无密钥的视觉编码,任何扫码器都会把原始字符串显示出来。放进去的敏感内容,对任何能拍到它的人都是可见的,哪怕隔着一段距离。
能自己选尺寸或纠错等级吗?
本工具不能,它固定输出 640 × 640、纠错等级 M。需要别的尺寸可以下载 PNG 后用图片工具缩放;如果码要印在容易磨损的物件上、需要 H 档,请直接用二维码库生成。
识别时会上传我的图片吗?
不会。文件或摄像头画面会被画到本标签页的 canvas 上就地分析,图像和识别出的文本都不会离开浏览器。
手机能认哪些载荷格式?
常见的有普通 URL、用于连网的 WIFI:、tel:、SMSTO:、mailto:、保存联系人的 BEGIN:VCARD,以及给验证器 App 用的 otpauth://。各系统支持程度不同,请在用户实际使用的机型上测一遍。
只改了几个字,为什么码变密了?
因为内容越过了容量边界,编码器升到了下一个版本,每边多出 4 个模块。把字符串缩短几个字符,通常就能退回去。
二维码最小能印多大?
取决于版本和扫码距离。一个实用经验是让每个模块不小于 0.4 mm,然后用手边最旧的一台手机实测。