字母数字模式
什么是字母数字模式
字母数字模式(Alphanumeric Mode)是 QR 码四种编码模式中,数据效率仅次于数字模式的一种。可处理的字符共 45 种:0-9 的数字、A-Z 的大写字母、空格,以及 $、%、*、+、-、.、/、: 这 8 个符号。需要特别注意的是其中不含小写字母。
中文里这一模式有「字母数字模式」和「英数模式」两种叫法,都译自英文名 Alphanumeric Mode 中的 alpha(字母)与 numeric(数字),指的是同一套机制。技术文档中多用「字母数字模式」,因为它把「字母与数字两类都能处理」这一点写得更明确。
45 种字符与压缩机制
压缩的做法是把 2 个字符配成一对,转换为 11 位。先给每个字符分配 0 到 44 的值,再把这一对中第 1 个字符的值乘以 45、加上第 2 个字符的值,所得结果用 11 位表示。末尾若余下 1 个字符,则用 6 位表示。按这种方式,最多可存放 4296 个字符。
实际能放多少字符,随 QR 码的版本(尺寸)与纠错等级而变。以纠错等级 M 为例,版本 1(21×21 模块)约 20 个字符,版本 10 约 213 个字符,最大的版本 40 可处理到 3391 个字符。纠错等级越高,用于复原的冗余数据越多,能存放的字符数就相应减少。字符串越短,所需版本越小,码的模块也越大,读起来越容易。
所支持的 45 个字符一览
| 类别 | 字符 | 值 |
|---|---|---|
| 数字(10 种) | 0 1 2 3 4 5 6 7 8 9 | 0〜9 |
| 大写字母(26 种) | A〜Z | 10〜35 |
| 空格(1 种) | (空格) | 36 |
| 符号(8 种) | $ % * + - . / : | 37〜44 |
分配给每个字符的 0〜44 的值,就是把 2 字符一对压缩为 11 位那道计算(第 1 个字符 × 45 + 第 2 个字符)的输入。下划线(_)、问号(?)、和号(&)等不在此表中,只要包含一个,编码就会切换到字节模式。
同一个链接的容量比较实例
以 32 个字符的链接「HTTPS://QRAFT.CC/JA/GLOSSARY/QR/」为例:全部转为大写后用字母数字模式编码,数据本体为 16 对 × 11 位 = 176 位。同样这 32 个字符,若保留小写而用字节模式编码,则每个字符 8 位,共需 256 位,两者相差约三成。当这一差距跨过版本(尺寸)的分界线时,QR 码看上去的尺寸就会大一档。
与数字模式、字节模式的差别,以及在链接上的运用
QR 码的程序库会查看输入的字符串,自动判定该用哪种模式。字符串里只要含有一个小写字母或一个汉字,就会切换到字节模式,因此字母数字模式被选中,仅限于输入整体都由那 45 种字符构成的时候。同样的字符数下它占用的容量比字节模式少,所以产品编号、序列号这类本来就只用大写字母与数字设计的字符串,会自动落入这一模式,数据密度随之提高。
链接是字母数字模式的代表性用途,但这里有个坑:链接通常含小写字母,照原样生成就会被判为字节模式。把链接转成大写之后再生成 QR 码,字母数字模式才会生效,数据本体的位数可减少约三成(每字符从 8 位降到 5.5 位)。HTTP、HTTPS 的协议部分与域名不区分大小写,转成大写也能正常工作。但如果服务器对路径或查询参数区分大小写,转换后就会指向不存在的地址,这一点必须先确认。