这段文字要多大的二维码:比特账、版本,以及 H 级到底贵在哪
二维码的大小在有人打开作图软件之前就已经算完了。你把文字打进去,网格就跟着定下来:这段文字值多少比特,符号里要划出多少码字给修复字,剩下的空间要多大的网格才装得下。大家第一个去拧的旋钮——一格模块多少像素——对这些毫无影响,它只是把一张已经定稿的图放大。
贴到公告栏上的码还能不能被读出来,是一个你能拿尺子去量的毫米数,而它同样从这套算术里出来。“扫得扫不出"这个问题,值得一问的就是这个毫米数。
版本只是一个尺寸,这就是它的全部含义
版本从 1 排到 40,第 v 版是每边 4v + 17 个模块的网格:版本 1 是 21,版本 3 是 29,版本 5 是 37,版本 40 是 177。数字变大不代表细节变多。信息还是那一片黑白点,版本更大只是把它们摊在更大的地面上——它让符号变大,不是变好。
每一版能放的码字数是固定的,码字就是网格装得下的 8 比特字。版本 1 在四个等级下都只有 26 个,等级决定的是这 26 个怎么分:L 级拿 19 个装你的文字、7 个做修复,H 级只有 9 个归你、17 个归修复。所以版本和等级是两个互不相干的旋钮:版本管你印多大的图,等级管这张图里有几分是你的。同样是 29 × 29 的符号,3-L 留 55 个数据码字,3-H 只剩 26 个。
你的文字值多少比特
三种模式,三种价。数字模式把三个数字压进 10 比特,合每个约 3.3;字母数字模式把 45 个字符里的两个压进 11 比特,合每个 5.5;字节模式对每个 UTF-8 字节收 8 比特。价码之外还有一笔开头费:4 比特写模式,再写一个字符数——它的宽度看版本落在哪一档,字节模式在 9 版以前是 8 比特,往后变 16,数字和字母数字过了 26 版还要再宽一次。
https://vixyun.top/tools/qr-code-generator/ 是 43 个字符,每个都只占一个字节,可它仍然走字节模式,因为字母数字那 45 个字符里没有小写。4 + 8 + 344 = 356 比特。
把同一串全写成大写,它就按字母数字计价:21 对每对 11 比特,外加落单的一个 6 比特,数据段 237 比特,一共 250。同样设在 L 级,这买回一个版本 2 的符号、25 × 25,而那些字符一旦保持小写就要版本 3、29 × 29。为了省这一圈去改网址的大小写当然会把链接改坏;真要默默替你折叠大小写的生成器,交给你的是一张读回来不是你输进去的图。内容本来就是大写的时候,这个便宜才真的值得占:运单号、订座码、模具上打出的件号。
中文按字节价付,一个汉字三个字节。你好,欢迎光临。是 8 个字符、24 字节、数据段 192 比特、加上一共 204 比特——一个汉字大约是一个数字的七倍价。标准里另有汉字模式,把双字节字符压进 13 比特,公开的容量表也按它给数:版本 1 的 L 级能放 10 个汉字,而走字节这条路只放得下 5 个。那套模式对应日语的双字节集合,二维码生成器没有实现它,所以中文一律按 24 比特一个结算。想知道你手里那几个字各占几字节,把文字粘进字符编码查询按字看,比记平均值可靠。
同一条 URL,四个等级
| 等级 | 版本与网格 | 留给数据的空间,对照那 356 比特 | 花在修复上的码字 |
|---|---|---|---|
| L | 3 —— 29 × 29 | 55 个数据码字 = 440 比特 | 70 个码字里 15 个 |
| M | 4 —— 33 × 33 | 64 个 = 512 比特 | 100 个里 36 个 |
| Q | 4 —— 33 × 33 | 48 个 = 384 比特 | 100 个里 52 个 |
| H | 5 —— 37 × 37 | 46 个 = 368 比特 | 134 个里 88 个 |
中间那一列要当预算读,不是当评级读。四行里你的文字都是 356 比特——等级不会让网址变短。等级改的是网格里划走多少码字做修复;一旦这笔预留开始啃到 356 以下,符号就得长大:4-H 只剩 288 个数据比特,所以这条串在 H 级跳到了版本 5。
M 和 Q 都落在版本 4,可一个给 512 比特、一个给 384,因为分块表按整码字、整分块跳,不按你的文字长度平滑变化。成品符号常常有相当一部分是填充,原因也在这里:M 级下你那 43 个字符占了 512 个数据比特里的 356,余下的位置由 0xEC 和 0x11 两个字节交替填满。H 级只剩 12 比特余量,填充字正好一个。图片下面那张比特流水账会把你实际打进去的东西逐项列出来——头部、数据段、结束符、补齐到字节边界的零、填充字、校验字。
7%、15%、25%、30% 说的不是上表那个数
这四个百分数在各处被引用,通常配一句话:“码被遮住这么多还能扫”。它们估的是阅读机能扛住多少破损的地面,而且是整张符号上的平均。校验字占比是另一个量,上面这张表已经打出来:3-L 是 21.4%,5-H 是 65.7%。同样四个字母,量的不是同一件事。
差别带来三条后果。
平均值说明不了破损落在哪儿。划痕、咖啡渍、贴纸、订书机都是成团来的;同样数目的码字,散在整张网格上比连成一片容易复原得多。
损伤也不是等价地贵。符号里有几处根本不装你的文字,而且位置是点名定死的:三个定位图形、两条时序轨道、格式信息区,版本 7 起还加两块写版本号的 18 比特。丢了一个角,任何等级都救不回来;把 logo 盖在版本 3 的正中间,比同样面积的小点分散在全图糟糕得多。
修复字是数据里让出来的一块,不是刷在图片外面的一层清漆。这就是升级要付钱的原因:符号里没有多出任何东西,是从你的文字里拿走了一部分。
版本 1 装得下五个汉字,装不下六个
版本 1 在 L 级有 19 个数据码字,即 152 比特,字节模式的开头费先扣掉 12 比特。所以容量表上写的是 17 字节——5 个汉字 15 字节,稳稳进去;6 个是 18 字节,进不去,符号跳到版本 2,网格从 21 × 21 变成 25 × 25。
同一版本换到 H 级只剩 9 个码字、72 比特,字节容量掉到 7。两个汉字还行,第三个就要换盒子。版本 1 的四个等级分别是 17、14、11、7 字节,短中文句子吃版本有多快,这四个数就是手感。
工牌上「张伟」加一个公司名,一版就装完了。一整段话不会是一张码——它是一段指向那段话的网址。
毫米数是从版本里掉出来的
图不只有符号本身。四周要留空白的静默区,标准要的是每边四个模块,于是 29 个模块的符号印出来是 37 个模块的图。按一格 0.4 mm 算,就是每边 14.8 mm。同一条文字升到 H 级:37 + 8 = 45 个模块,18 mm。
贴在店门上,3 mm 不算什么;印在笔杆、挂绳牌或者小票一角,这 3 mm 就是"能扫的码"和"一块装饰"的区别。关于 0.4 mm 有两件事要说清:它是关于手机摄像头在胳膊长的距离上能不能分辨的经验值,不是从标准里抄来的数——标准那套表按符号尺寸和观察距离给;而你需要印得更小的时候,能拧的旋钮从来不是像素那一格,是文字长度和纠错等级。把每格像素调小,只是同一套几何配上更少的墨,那正是摄像头分辨不出来的东西。
屏幕上也讲同一套算术。你一像素一格地要,那个框就给:版本 2 的符号连上静默区,画出来是 33 × 33 像素。守着这段取值范围的说明白把话说在前头——一像素一格正是从屏幕上读码开始失效的地方,而 40 是一个 version 40 的符号会把身后画面整个顶出去的地方。画面本身收在每边 4,096 像素,那是多数浏览器给画布设的上限,不是这里自己定的。
导出这一步和网格一样要紧。8 像素一格的 PNG 是一张有真实边缘的位图,如果它在送去印厂的途中被重采样或者过一次有损编码,扫描仪一直在读的就是那些边缘。图片压缩器会把你这个文件在各格式下实际输出多少字节量给你,低画质 JPEG 怎么对待一张码,看一眼就知道了。要印刷就用 SVG 导出:同样的模块直接写成矢量矩形,重采样这一步整个没有了。
浏览器里这个框,什么时候不该用
长数据是最清楚的一类。编码停在 4,000 个字符,而这世上最大的符号在 L 级装 2,953 字节的数据——再长就是一段文本该是个文件,而不是一张码,一张你拍不到的码也没什么用。把长文字放在一条短链接后面,只对那条链接生成。
混合内容是较隐蔽的一类。一个模式指示符只管整串,所以 PK-2026-118 张伟 从首到尾都按字节模式结算;而会分段的编码器把串切成字母数字段、数字段、字节段,各按各的价付,出来的符号更小。分段是真技术、真省,但它替你做了一个关于你文字的断言——一个朴素的生成器不替你做这个决定。
还有一句关于往返验证的实话。每个模块放好之后,成品网格会在浏览器里被重新解一遍,和输进去的东西对账:两份格式区各自抬起再互相比对,里德-所罗门余式按网格现在说的话重算,字符串拼回来逐字比。这能抓住位点错位、交织顺序写反、分块切错那一类毛病。它证明不了这张码合法,因为同一个文件对标准的理解被用了两遍,一起读错就能一起对得上。真正要紧的那次测试,用一台你不拥有的扫描仪,在一张你拿在手里的印刷品上。
这条路适合做什么:输入的内容不会离开这台设备,所以一张写着别人手机号和住址的名片可以在火车上做出来,模块网格也是算出来的、不是某家服务替你猜出来的——它顺带还想要你的流量。不适合做什么:一夜之间重出一万张各不相同的码,每张带自己的序列号;或者一套设计规范要同一份源文件在四种印刷尺寸下发同样的码。这些要的是一份库、一个构建步骤,以及一个真正管版本的人。
相关问题
中间要放 logo,是不是就得选 H 级? logo 盖住的是模块,等级决定的是码字怎么分,两者不管同一件事。盖住定位图形,什么等级都读不出来。同样的文字,缩短一点配 M 级,好过原样配 H 级再贴一块标——更小的符号每格模块还有余量。
我的文字为什么会一次跳两个版本? 有两笔价同时变:字符数字段过了 9 版要变宽,过了 26 版再宽一次;分块表每块的数据码字也是成台阶地跳,不是平滑的。刚好快填满一版的字符串,被加宽的计数字段顶上去两版是常事。
印出来的码能读出它是哪一版吗? 沿符号本身边数一圈模块(空白别算),解 4v + 17 就行。版本 7 起还会把自己的号码在两个 18 比特的块里各写一遍,阅读器不必猜。
每格像素调大是不是更好扫? 只在印刷分辨率还能保住边缘的那一段里是。版本一定,几何、掩码、修复字的配额就都定了,剩下的只是每个方格上你压了多少墨。