第八章 · 条形码与二维码:让机器替你读
上一章的校验位是个很朴素的方案:既然人一定会抄错号码,那就多写一位,让机器当场算一遍。但你有没有想过——为什么非得让人抄?收银员敲键盘、库管员填单子,这两个动作才是错误的源头。校验位是亡羊补牢,而条形码的思路更狠:把号码变成一幅图,让人从头到尾别碰它。
这就是条形码(barcode)的出发点——用一排宽窄不一的黑条白缝,把一串数字编码成光线能直接"看"到的东西。它不在编号上做任何加法,它改变的是编号的载体:从给人看的符号,变成给光看的图案。
条纹为什么这么画
随便拿起手边一件商品看它的条形码,你会发现两件事:条纹只有黑和白,没有灰;条纹有的粗有的细,但粗细就那么几种。这不是审美选择,这是为一件非常具体的事情设计的——激光扫过去的那一瞬间。
收银台的扫描枪发出一道红光横着扫过条形码,黑条吸光,白缝反光,接收器看到的其实是一串"暗—亮—暗—亮"的电压起伏。机器根本不"看"条纹,它只听这串起伏的节奏:暗持续了多久,亮持续了多久。每个数字占 7 格等宽的模块,由"黑—白—黑—白"四段拼成,每段宽窄不一,窄的只占 1 格,最宽的占 4 格。不同数字就对应不同的宽窄排列——机器量出这四段各占几格,一查表就知道是哪个数字。换句话说,条形码不是一种图案,它是一种摩尔斯电码,只不过点划换成了宽窄。
为什么不用灰度?因为印刷会糊。1972 年 RCA 和克罗格超市在辛辛那提一家门店做过一次著名的真实试点,把条码印成同心圆靶(绰号"牛眼码"),想法很妙——圆形从哪个方向扫都能读。结果不尽如人意:印刷机稍微洇一点墨,圆环就容易糊成一片,分不出环的边界。牛眼码最终没能成为标准——1973 年,超市行业专门成立的委员会在各家提交的方案里反复比较,最后选定了 IBM 设计的线性条纹码,也就是今天的 UPC。这个决策考虑的因素很多,印刷容错是关键的一条:条纹严格平行,即使墨洇开了,黑条只会变粗变细一点点,而黑白之间的边界依然锋利。好设计往往先想清楚"最坏情况下它怎么坏"。
条形码里还藏着一处从前面几章借来的设计:开头、中间、结尾各有一组略长的条纹,叫分隔条——相当于给机器的路标,告诉它"从这里开始读,读到中间别停,到这里结束"。有了路标,扫描枪不管从左往右还是从右往左扫,都能把号码正过来。层级、分隔、校验,这些机制在这本书里反复出现,因为它们是解决同一类问题的同一类答案。
一包口香糖的清晨
1974 年 6 月 26 日早上 8 点 01 分,俄亥俄州特洛伊市一家 Marsh 超市,收银员把一包绿箭口香糖(Wrigley's Juicy Fruit)放到了扫描台上——这是人类历史上第一件被条形码卖出的商品。那包口香糖如今收藏在史密森尼博物馆。
值得记住的不是这个仪式感时刻,而是它之前的三十年。条形码的专利 1952 年就被伍德兰和西尔弗拿下了——据说灵感来自他在沙滩上把摩尔斯电码的点划拉长成了条纹。但之后的二十年几乎没有商店愿意用,因为条形码是一个典型的鸡生蛋系统:没有扫描枪,厂家不愿印码;没有商品印码,商店不愿买扫描枪。最后打破僵局的是行业协会定了全美国统一的标准(UPC),所有厂商印同一套码,所有扫描枪读同一套码——编号系统最值钱的从来不是技术,而是"所有人都认它"这个共识本身。
二维码:把电码铺成围棋盘
条形码能装下大约 20 个字符,管一盒口香糖绰绰有余,但到了 1990 年代的丰田工厂就不够用了。当时的汽车零部件要追踪零件号、批次、产地,工人得在一个箱子上贴好几张条码、扫好几次。丰田子公司 Denso Wave 的工程师原昌宏(Masahiro Hara)被派去解决这个烦人事,两年后,1994 年,他交出了答案:二维码(QR Code,QR 是 Quick Response,"快速响应"的缩写)——把条形码那排一维的条纹,铺成二维的方格。
据说原昌宏的灵感来自午休时下的围棋。围棋盘的黑白格点天然就是一种二维编码:条形码只能在一个方向上排黑白,方格在两个方向上都能排,同样的面积装的信息直接翻两个数量级——标准二维码最多能装 7089 个数字,写下一整段网址还有富余。
你注意过二维码三个角上那三个"回"字形的大方块吗?那叫定位符——手机摄像头靠这三个锚点瞬间判断码在哪里、转了多大角度、歪了多少,然后把它"掰正"成一个标准的方格网,再逐格读出黑白。三个锚点在三个角而不是四个,是故意的:第四个角留空,机器一眼就知道哪边是"上",你把码转 90 度它也能认出来。
缺了一角为什么还能扫出来
二维码最神奇的本事是:贴纸被撕掉一块、被咖啡渍盖住一角,甚至中间被人印了个 logo,它照样能扫出来。这不是运气,是它出厂时就自带了"备份"。
二维码内部用一种叫里德-所罗门纠错(Reed-Solomon error correction)的数学方法存数据——大白话说,它把要存的信息打碎成许多小块,再额外算出一批"冗余块"一起存进去;读的时候,就算丢了一部分块,靠剩下的块也能反推出丢失的内容。就像拼图少了几片,但每片边缘都有和邻片重复的画面,缺的画面能推回来。
更妙的是,冗余的量是可调的设计参数,不是固定值。二维码有四档纠错等级:L 档允许约 7% 的面积损坏,M 档 15%,Q 档 25%,H 档 30%。印在小卡片上的码用低档,省地方;印在户外广告牌上、天天风吹日晒的码用高档,宁可多花格子也要买容错。你在餐厅扫码点单的那个码如果中间有店家的 logo,它几乎一定是 H 档——设计师早就把"要被 logo 盖住"这件事算进了冗余里。第七章的校验位只能告诉你"这串数错了",而纠错码能告诉你"错了,而且正确答案是这个"——这是检测和修复的区别,一个报警,一个自愈。
一句话总结这两代编码的关系:条形码说"别让人抄",二维码说"别让图坏"。前者消灭录入这个环节,后者假设录入之后还会遭遇磨损、污渍和破坏,并提前买好保险。编号走到这一步,已经不只是"唯一地标识一个东西",而是"在糟糕的现实世界里可靠地存活下来"。
Denso Wave 还做了一个关键决定:手握二维码的专利,但宣布不收专利费、开放给所有人用。三十年后,这个原本为汽车零件设计的小方格,成了中国街头从煎饼摊到公交站都在用的基础设施——又一次,编号的价值来自共识,而开放是获得共识最快的方式。
不过你有没有发现一个问题:到现在为止,我们给商品编号、给信息编号,可这些号码都印在包装和屏幕上。东西本身呢?你手里这部手机出厂时就被烙上一个全球唯一的"身份证号",不归任何商店管,却能让全世界的网络认出它。谁有权给全世界每一台设备发号?下一章,我们去看看编号背后的"户籍科"。