antares
1948年的一天,美國費城的一家超市店主找到卓克索理工學院(后更名為卓克索大學)的院長,請求開發(fā)一種有效的產(chǎn)品數(shù)據(jù)編碼方法。他希望,運用這種編碼方法,顧客每次在購買商品時,收銀員就不用手動去輸入每件商品的名稱,只需要用收銀機對準商品,就能自動識別出來。這不僅能減少出錯率,還能提高收銀效率。但如何才能辦到呢?
機器的“視覺”和人類的視覺并不一樣。對人類來說,只要上過學就能辨認文字。而想讓機器來辨認文字卻相當困難——特別是當文字的字體、大小、顏色等都不規(guī)則的情況下。相反,機器擅長識別的是規(guī)則排布的色塊。如伺將文字轉化成色塊呢?
所幸,當時就有一個現(xiàn)成的參考對象:摩爾斯電碼。這是電報機使用的一種編碼方式。電報機是一種早期的無線通信機,發(fā)報機只有一個鍵。如果發(fā)報方按下那個鍵,收報方就會聽到一聲“嘀”,如果按得長一點,就會聽到長一點的“嘀——”。因此,想要用這種機器傳遞消息,就必須想辦法用單調(diào)的“嘀”表示文字。實際的做法就是把每個字母和數(shù)字按照固定的規(guī)則轉換成長音和短音的組合。
國際摩爾斯電碼
1.一點的長度是一個單位
2.一劃是三個單位
3.在一個字母中點劃之間的間隔是一點
4.兩個字母之間的間隔是三點(一劃)
5.兩個單詞之間的間隔是七點
雖然電報已經(jīng)退出了歷史舞臺,但是,這種“用兩種符號構成的符號串編碼字母/數(shù)字”的做法可是要劃個重點的?,F(xiàn)在你用到的電腦、手機等電子設備能處理文字,其背后都用到了“編碼”的思路。而我們接下來要說明的條形碼和二維碼,自然也不例外。
沿著這條思路開發(fā)出來的就是條形碼,其設計思路是用黑色細線代表1,白色細線代表0,然后用這兩種符號進行編碼。條形碼最大的用途就是表示商品編號,除此之外,一些國家的郵政也會用條形碼表示地址和郵編。
如果你去超市里拿起一件商品,就可以試著找找上面黑白色的條帶。每件商品都有一個編號,由代表國家、生產(chǎn)商、貨品、校驗碼的一系列數(shù)字構成。每個數(shù)字又轉化成7根黑色或白色的細線排布在一起。當收銀員用掃碼器掃描條形碼的時候,就可以通過條形碼的黑白排布反算回0和1的組合,然后再轉化回商品編號,由此知道你買了哪件商品。
通用產(chǎn)品代碼示意圖,這是一種在美國便用的12位商品條形碼。每個數(shù)字會被編碼為7根黑色或白色的細線,綠色部分則是用于定位的固定黑線。目前國際上更常用的是一種叫國際商品編碼的13位編碼,它的編碼方式要更復雜一些。(來源:Wikipedia)
條形碼的編碼方式和摩爾斯電碼不同,主要是因為它使用時需要顧慮到的因素不同。發(fā)電報的時間越短越好,所以設計時采用了變長碼,常用的字母如E和T只用一個符號,而不常用的(比如Z)就很長。但是,這種設計無法識別發(fā)報時發(fā)生的錯誤。倘若把一個長音聽成了短音,或是聽漏了兩個字母之間的空白,那解讀出的字母就會出錯。不過,由于電報本質(zhì)上發(fā)送的還是一句話或是一封信,因此通過上下文多少能修正字母的錯誤。條形碼呢,因為已經(jīng)把商品轉換成了數(shù)字編碼,所以任何一個數(shù)字出錯都可能會導致識別成完全不同的商品。在國際商品編碼中,7位的黑白細線總共有128種可能性,但只使用了其中30種用來表示0-9的數(shù)字(每個數(shù)字會根據(jù)在第幾位選擇3種不同的編碼方式之一來使用),就是為了應對可能產(chǎn)生的錯誤。
另外值得一提的是左中右的幾根稍長一點的黑白細線。這幾根線是用來定位的,可以讓掃描器確定條形碼的位置,以及細線的粗細。這樣,條形碼在印刷的時候就有了一定的自由度,可大可小,掃描的時候偏一些也不要緊。
目前最常用的二維碼QR碼的結構(來源:Wikipedia)
有了條形碼以后,頭腦靈活的人們就自然會想,能否用這種技術來表示更長或是更復雜的內(nèi)容。仔細想想,“用長條表示一個符號”的效率其實相當?shù)?。既然掃碼器的掃描精度高于線的粗細,那為什么不能把細線弄得更短,變成小塊呢?根據(jù)圍棋的黑白棋子分布,日本工程師原昌宏找到了靈感,發(fā)明了這種把黑色或白色小塊排布在二維平面上構成的二維碼。
和條形碼一樣,二維碼也有許多不同的樣式。設計原理大同小異,都是用黑白色塊表示0和1,用來編碼文字。二維碼編碼方法的細節(jié)比條形碼要復雜很多,想完全解釋清楚有點超出本文的篇幅。以現(xiàn)在最流行的QR碼為例,它在左上、右上和左下分別有三個大的回字形定位標志,剩下的部分中會有一些小的回字形校正標志,以及編碼版本和格式信息。剩余的部分則是編碼。QR碼的編碼標準提供了從21×21到177×177大小的選擇,最小的可以編碼25個字母或10個漢字,最大的可以編碼4296個字母或1817個漢字——足以儲存完一整篇小作文了。
二維碼的一個有趣的設計在于,它對文字的編碼里除了包含需要編碼的文本,還包含了一些“校驗碼”。校驗碼的設計用到了大學數(shù)學系才會學到的代數(shù)知識,讓二維碼可以具備一定的糾錯功能。即使部分編碼變臟或破損,也可以解碼出原本的文本。QR碼的設計中允許選擇四種校驗等級之一,等級越高,校驗碼越長(也就是說同樣面積的二維碼能編碼更少的文本),但是糾錯能力越強。最高的一級可以在30%的二維碼破損的情況下仍然能還原原先的文本。當然,現(xiàn)在大家的二維碼大多都顯示在手機或電腦上,幾乎不會有什么變臟或破損的情況。所以,很多人會反其道而行之,利用這一特性在二維碼上做一些藝術加工。只要藝術加工的面積不太大,二維碼仍然可以正確識別。
經(jīng)過藝術加工的二維碼
二維碼本身只是一種通用的文本編碼方式,它的具體應用取決于里面蘊藏的文本。例如,火車票上的二維碼包含了加密之后的乘車人姓名、車次等信息,便于機器識別??爝f包裹上的二維碼包含的是快遞單的信息,包括單號、收件人地址等等,快遞員就可以用識別器直接解讀。如果你想要給朋友寫一封信又不想讓他媽媽看到,也可以把信轉化成二維碼之后打印出來交給你的朋友(當然,如果他媽媽了解二維碼知識,就會嘗試用手機上的二維碼解碼器來解讀)。
現(xiàn)在,二維碼最常見的使用場景大概就是掃碼支付了。你可以用手機掃描商家的二維碼,并直接打開支付軟件付款;或是讓商家掃描你的付款碼收錢。這其中的奧妙仍然是二維碼本身內(nèi)部蘊含的信息。商家二維碼中包含的信息其實是網(wǎng)址。比如說,如果你打開支付寶的“收錢”頁面,截屏發(fā)到電腦上,然后用隨便哪個網(wǎng)頁版二維碼解碼器解碼,會解出像這樣的字符串:https:∥qr.alipav.com/fkx15663nbtiwpiomkd3f4b?t=1611382295768。其中第一部分指向支付寶(alipay.com)的網(wǎng)站,斜杠后面的字符串則包含了收款人的代碼和一些驗證碼。手機上的二維碼解碼器對于包含網(wǎng)址的二維碼做過優(yōu)化,解碼之后會自動打開網(wǎng)址或者打開對應的App,然后App就會識別斜杠后面的部分并處理。支付寶App拿到這個地址后,就會打開付款界面了。
1948年,卓克索理工學院里一位名叫Norman Joseph Woodland的年輕人從摩爾斯電碼入手,和他的朋友Bernard Silver聯(lián)合發(fā)明了條碼技術,并于1949年申請專利。1974年,一盒10條裝的箭牌口香糖成了第一個使用條形碼的商品。
編碼,即將信息從一種形式或格式轉換為另一種形式。比如我們生活中接觸到的條形碼和二維碼都是將信息轉換后的結果。那么,你能用8根或長或短,或黑或白的線,組合出不同的編碼嗎?你能搭配多少種組合?