二维码生成

把要放进去的内容填好,二维码立刻出现。下方会原样显示编码进去的字符串 —— 在把它印到任何东西上之前,先看一眼它是不是你想说的意思。

参数

级别越高越抗污损,但可容纳的数据越少 —— 长内容可能 M 装得下、H 装不下。

像素

下载的图片是这么多像素见方;预览会缩小显示。

二维码四周的空白边。标准要求留 4 个模块。

下载 PNG

预览

填好上面的内容,二维码就出现在这里。

Advertisement

使用方法

  1. 选择二维码里放什么

    链接或纯文本、Wi-Fi 网络、邮件、短信、电话号码,或者联系人名片。选完之后下面的输入项会跟着变:Wi-Fi 要填网络名、密码和加密方式,名片要填姓名、公司和电话。

  2. 核对编码进去的字符串

    预览下面那一行就是二维码里真正存的字符串,每次都值得看一眼:Wi-Fi 密码里有没有分号、网址是不是漏了 https://,都是在这一行发现的。

  3. 设定容错级别

    它决定二维码被弄脏、遮挡多少之后仍然能扫出来。级别越高越抗损,但能装的数据越少。如果打算在中间放 logo,记得往上提一级来补偿。

  4. 下载 PNG 或 SVG

    PNG 按你选的像素尺寸导出;要印刷或者以后可能要放大的场合用 SVG —— 它没有固定分辨率,名片和海报可以共用同一个文件。

二维码里装的是一串字符,仅此而已

二维码里没有"链接",只有一串字符,扫出来之后做什么完全由扫码的那个软件决定。这串字符以 https:// 开头,大多数手机会问你要不要打开;以 WIFI: 开头,手机会问要不要加入这个网络;以 BEGIN:VCARD 开头,手机会问要不要存成联系人。这个工具做的事,就是帮你把这串字符拼对。

也正因为如此,二维码本身永远不会"过期"。这里生成的是静态码:目标直接写在图案里,只要图案还看得清就能扫。市面上按月收费的是另一种东西 —— 它编码的是一个由服务商控制的短跳转地址,所以才能统计扫码次数、才能事后更换目标,也所以一旦停止付费就会失效。两种各有用途,但它们不是同一种产品,而这个区别很少被讲清楚。

编码本身有几种模式。纯数字模式把数字压得很紧,所以只存一个电话号码的二维码,格子看起来会明显比存网址的粗大。字母数字模式支持大写字母和少量符号。字节模式能装任意文本 —— 小写网址、中文、日文、韩文走的都是这一种。另有一种专为日文优化的汉字模式更省空间,但各种扫码器对它的支持参差不齐,而退回字节模式多占的地方其实很少,不值得为它冒险。中文在 UTF-8 里一个字占三个字节,所以同样字数的中文载荷大约是拉丁字母的三倍长 —— 这就是为什么一段不算长的中文会比你预想中更早撞上容量上限。

按二维码要待的地方选容错级别

二维码里带了冗余数据,所以图案被弄脏或者遮掉一部分仍然能读出来。四个级别大致能恢复 7%、15%、25% 和 30% 的面积,通常记作 L、M、Q、H。

代价很直白:冗余越多,同样的内容就需要越多格子,图案越密。而密对小尺寸扫描和廉价打印机都不友好。所以合理的默认值是 M —— 蹭一下、按个手印都还能读,图案又不至于明显变密。该往上调的情形是:你确知会有东西盖住一部分。最常见的就是中间放 logo,一个占面积十分之一的印刷 logo,放在 Q 或 H 都还算宽裕。

该往下调的情形是:内容很长,图案已经密到印不出来。一条很长的带跟踪参数的网址放在 H 级,用 300 dpi 标签机打出来可能糊成一团灰。更好的办法通常不是降级别,而是先把网址缩短 —— 它同时改善了图案密度和目标网址本身的可用性。

还有一个实际因素:不少廉价扫码器和一部分手机相机,对旋转和镜像的处理远没有标准允许的那么宽容,对低对比度的容忍度也远低于容错级别那几个百分比给人的印象。H 级的码如果印成浅灰底深灰块,照样扫不出来。对比度比级别重要。

Wi-Fi 码很方便,代价是把密码交出去

Wi-Fi 二维码是绝大多数人用生成器做的最有用的一件事,但它到底做了什么,值得说明白:密码是以明文存在码里的。没有加密,没有有效期,也没法撤销 —— 谁拍到了这张码,谁就拿到了密码,用一个只做"读取文本"这件事的 App 几秒就能解出来。

这用在咖啡馆墙上、给访客用的网络上完全没问题。但把它贴在半个公开的地方、而它通向收银机所在的那个网络,就不行了。老规矩仍然成立:访客走单独的网段并打开客户端隔离,并且把这张二维码当成和写在黑板上的密码一样公开。

Wi-Fi 载荷有两个细节造成了绝大多数失败。第一,这个格式用分号和冒号当分隔符,所以网络名或密码里出现这些字符时必须用反斜杠转义 —— 像 `co;fee2024` 这样的密码,不转义的话扫码器会在分号处截断。这个工具会自动转义,并且把转义后的字符串显示出来让你看见发生了什么。第二,iOS 11 以上和 Android 10 以上都能直接用相机连上网络,不需要装任何 App;但更老的安卓和不少第三方扫码 App 只会把这段文字显示出来,不会提示连接。贴在墙上给访客用的码,应该按"什么设备都可能"来准备。

隐藏网络可以通过一个额外的标记支持,但用在这种场合并不划算:手机必须拿网络名去主动探测,更慢,而且部分机型并不可靠。

为什么屏幕上扫得好好的,一印出来就不行

二维码最常见的失望不是"码坏了",而是它在显示器上完美工作,一印到纸上就扫不出来。几乎每次的原因都是尺寸和静区。

静区就是图案四周那圈空白边,标准要求四边各留四个模块 —— 四个小方格。它看起来像浪费空间,而设计的人一直在裁它。裁静区是让二维码变得不可靠最快的办法:扫码器需要这圈白边来定位图案、判断方向。如果版式实在排不下,应该把码缩小,而不是把边裁掉。

另一半是印刷尺寸。经验法则是:二维码的边长至少是扫描距离的十分之一 —— 30 厘米外扫的,边长要 3 厘米左右;3 米外扫的,边长要 30 厘米左右。这是对干净、光线充足的码说的。隔着玻璃、走廊昏暗,或者表面会磨损,就翻倍。

几个悄悄起作用的印刷细节:深色印在浅色上,绝不反过来 —— 即使标准允许反色,多数扫码器处理得都不好。别用光面纸配射灯,反光正好落在相机看的位置。户外用的亚光覆膜比不覆膜更能挡雨和指纹,多这一道工序是值得的。

最后,整批印刷之前先试一张:按实际尺寸、用实际材料打一份,拿一台便宜的手机在弱光下扫一下。这两分钟能挡掉的问题,会在乘上五千份之前被发现。

名片、邮件、短信和电话码

名片模式生成的是一张可以直接存进通讯录的 vCard。用在会议胸牌或纸质名片上确实方便,而它有一个经典的坑:vCard 标准里姓名存成「姓;名」,而显示名是「名 姓」。顺序写反了,从这张码存下来的人,在别人通讯录里全都会按名字排在姓氏那一栏。这个格式还要求用 CRLF 换行,有些老扫码器对此执行得很严格 —— 用普通换行拼出来的码,可能只存进第一行。

邮件码会在手机的邮件 App 里打开一封新邮件,地址已经填好,主题和正文可选。主题和正文在载荷里必须做百分号编码,这就是 mailto 字符串看起来那么难读的原因;这个工具替你拼。手机上支持度接近百分之百,桌面端扫码软件里接近零 —— 这通常可以接受,毕竟没人会拿笔记本电脑去对着海报扫。

短信码是这一类里最不一致的。有两种互不兼容的写法,不同扫码器支持的还不一样。这里用的是 SMSTO:,它是被最多 App 认识的写法,包括多数第三方扫码器和两大手机平台。做"发短信预约"的牌子用它算合理,前提是接受少数扫码器只会把文字显示出来。

电话码最简单也最可靠:tel: 载荷会让手机打开拨号盘并填好号码。对于必须万无一失的场合 —— 海报上的客服热线、传单上的求助电话 —— 在码旁边同时印上普通电话号码仍然是更稳的组合,因为码扫不出来的时候,电话号码至少人还能读。

最后更新:

常见问题

二维码会过期吗?

不会。这里生成的是静态码:目标直接编码在图案里,只要图案还看得清就一直有效。按月收费的商业服务是另一种东西 —— 它们的码里存的是一个由服务商控制的跳转地址,所以能统计扫码次数、能更换目标,但订阅一停,码也就失效了。

内容会被上传吗?

不会。编码是在页面里用 JavaScript 库完成的,文本、网址和 Wi-Fi 密码都留在你的浏览器里。这一点在这里尤其要紧,因为 Wi-Fi 密码和联系人信息恰好是你最不希望发到别人服务器上的东西。

能在中间放自己的 logo 吗?

可以,但要小心。先把容错级别调到 Q 或 H —— 冗余就是干这个用的。logo 宽度别超过整码的五分之一,而且绝不能盖住三个角上的大方块,那是扫码器用来定位的。做完之后拿几台不同的手机都扫一遍再印刷。

该印多大?

粗略规则是扫描距离的十分之一:30 厘米外扫的印 3 厘米,3 米外扫的印 30 厘米。光线差、隔着玻璃、表面容易脏,就翻倍。不要为了排得下而裁掉静区 —— 宁可把码缩小。

看着没问题,就是扫不出来,为什么?

先查对比度(必须是深色印在浅色上,不能反色),再查静区,然后查印刷尺寸。这三样之外,常见原因是光面纸反光、logo 盖得太多,或者内容太长、在低分辨率打印机上格子糊成了一片。最后一种靠缩短内容解决。

能统计被扫了多少次吗?

静态码做不到 —— 图案里没有任何计数机制,被扫的时候也不会联系任何服务器。要统计次数就得用商业服务那种基于跳转的码,每一次扫码都要经过他们的服务器。这有隐私代价,值得权衡:服务商能看到每一次扫码。

里面的链接一定要是 https 吗?

二维码能不能用不取决于它,但扫码的人的体验取决于它。现在的浏览器对普通 http 会明显警告,有些甚至只肯问你要不要打开、而不是直接打开。如果这张码要用很久,请用 https,并且一年之后确认目标还在。

为什么放了中文之后码变得这么密?

因为载荷是按字节算的,不是按字数。中文、日文、韩文在 UTF-8 里一个字占三个字节,所以 40 个汉字大致相当于 120 个拉丁字符,需要更密的图案。如果密到印不出来,应该缩短文字,而不是降低容错级别。