QR 码

二维条形码的一种。最多可存放 7,089 位数字或约 1,800 个汉字 (版本 40、纠错等级 L 的情况),并具备纠错功能。

QR 码 (Quick Response Code) 是 1994 年由 DENSO WAVE 公司开发的二维条形码,最初是为汽车零部件的管理而制定的规格。传统条形码只在横向持有数据,而 QR 码在纵横两个方向上都排布数据,因此在同样的尺寸下能处理的信息量要多出一个数量级。只要用智能手机的相机扫一下就能打开 URL 或完成支付,凭着这份轻便,它在世界范围内普及开来。

QR 码有从版本 1 (21 × 21 模块) 到版本 40 (177 × 177 模块) 的规格,版本越高能存放的数据越多。常被引用的最大容量都是"版本 40 且把纠错等级取为最低的 L"时的数值:只有数字时 7,089 位,字母数字 4,296 个字符,8 比特的字节串 2,953 字节,汉字 (Shift_JIS) 1,817 个字符。同一版本下把纠错加强,容量就会减少,所以这些数字不能直接当作实际工作中的上限来指望。实际上绝大多数用途是 URL 或支付令牌这类几十到几百字节左右的数据。

容量会因字符种类而不同,是因为装填数据的模式分成了几种。数字模式用 10 比特表示 3 位数字,字母数字模式用 11 比特表示 2 个字符,字节模式用 8 比特表示 1 字节,汉字模式用 13 比特表示 1 个字符。这里成为陷阱的是字母数字模式的字符集:它能处理的只有数字、大写的 A 到 Z、空格,以及 $ % * + - . / : 这 8 个符号。含有小写字母的 URL 装不进字母数字模式,只能用字节模式存放,于是每个字符占用的比特数增加,容量也更快耗尽。

纠错功能是 QR 码的一大特点。它分为 L (7%)、M (15%)、Q (25%)、H (30%) 四个等级,在等级 H 下可以复原丢失数据的约 30%。这个比例是相对于码字 (把数据切分后的符号) 总数的比率,而不是相对于符号图形面积的比率。即使污损的面积相同,落在哪些码字上也会左右能否复原。开发方 DENSO WAVE 公司说明,通常选得最多的是 M (15%)。把企业标志放在中央的设计款 QR 码之所以能成立,也是靠这份纠错能力,但被标志遮住的部分会先把纠错能力用掉一些,因此之后承受污损和破损的余力就减少了。提高等级后,同样的数据也会用上更高的版本,如果印刷尺寸不变,单个模块就会变小而更难读取,所以要同时看容易污损的程度和能印刷的大小来决定。

在安全方面,QR 码有一个弱点:里面的内容无法用眼睛确认。只要在正规的码上面贴一张伪造的贴纸,就能把人引向另一个 URL,已有报告指出这种手法被用在停车计时器等支付用的码上。使用者一侧的对策,归结为在打开之前确认读取后显示的 URL 的域名,以及不使用读到链接就不经确认直接打开的设置。张贴码的一方则需要定期巡视,查看有没有被换贴过。

从字数统计的角度需要记住的是,QR 码的容量不是由"字符数"决定,而是由"在哪种模式下每个字符用掉多少比特"决定。例如把含有日语的 URL 做百分号编码,在 UTF-8 下 1 个字符是 3 字节,而每个字节又都被换成 %XX 这种 3 个字符的写法,因此每 1 个日语字符要在字节模式里消耗 9 字节。只数眼睛看到的字符数就会看错容量,在这个意义上,这与字符数与字节数的区别是同一个问题。把很长的 URL 做成码时,先数出字节数、对版本有个大致预估,就能避免印出来比预想的大、或者太小读不出来这类事故。

分享这篇文章