为什么大写字母的二维码比小写字母的二维码小?

看看这两个 QR 码。 如果你喜欢,可以扫描一下,我保证里面没有任何可疑之处。

左侧为大写 HTTPS://EDENT.TEL/,右侧为小写 https://edent.tel/

可以清楚地看到,左边的 QR 是一个 “较小 ”的 QR,因为它的数据位较少。这两个 QR 都指向相同的 URl,唯一的区别是大小写不同。

这是怎么回事?

你首先想到的可能是纠错级别不同。二维码的冗余度会越来越高,以确保在损坏时仍能被扫描。但是,在这种情况下,它们都具有低纠错功能。

较小的代码是 “类型 1”–它是 21px * 21px。较大的是 “类型 2”,为 25px * 25px。

官方规范对这些版本有更详细的描述。较小的代码应能容纳 25 个字母数字字符。但 https://edent.tel/ 只有 18 个字符。那么,为什么要把它放到较大的代码中呢?

使用 ZXING 等解码器可以查看每个代码的原始字节。

大写:

20 93 1a a6 54 63 dd 28   
35 1b 50 e9 3b dc 00 ec
11 ec 11

小写:

41 26 87 47 47 07 33 a2   
f2 f6 56 46 56 e7 42 e7
46 56 c2 f0 ec 11 ec 11   
ec 11 ec 11 ec 11 ec 11
ec 11

您可能已经注意到,它们都以相同的序列结尾: ec 11 这些是 “填充字节”,因为数据需要完全填满 QR 码。但是–等等!- 上边的字节不仅安全地包含了文本,而且还有一些空闲的填充字节?

答案就在前几个字节中。

一旦读取了原始字节,QR 扫描仪就需要确切地知道它正在处理的是哪种代码。前四位会告诉它模式。让我们把十六进制转换成二进制,然后在前四位后进行拆分:

Type HEX BIN Split
UPPER 20 93 00100000 10010011 0010 000010010011
lower 41 26 01000001 00100110 0100 000100100110

上部代码为 0010,表示字母数字模式–标准规定接下来的 9 位显示数据长度。

下位代码为 0100,表示字节模式–标准规定接下来的 8 位显示数据长度。

Type HEX BIN Split
UPPER 20 93 00100000 10010011 0010 0000 10010
lower 41 26 01000001 00100110 0100 000 10010

看看这个!它们的长度都是 10010,转换成二进制后是 18,正好是文本的长度。

字母数字模式每两个字符使用 11 位,而字节模式每个字符使用(你猜对了!)8 位。

但为什么小写字母代码要被推入字节模式呢?不是使用字母和数字吗?

嗯,是的。但为了高效存储数据,字母数字模式只能使用有限的字符子集。大写字母和少量标点符号:空格 $ % * + - . / :

幸运的是,这对于协议、域和路径来说已经足够了。遗憾的是,没有 GET 参数。

就是这样。如果您希望包含 URl 的二维码的物理尺寸尽可能小,请确保文本全部使用大写字母。

本文文字及图片出自 Why are QR Codes with capital letters smaller than QR codes with lower-case letters?

你也许感兴趣的:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注