【转载】聊聊二维码

一维码(条形码)

在介绍二维码之前,先来看看它的“大哥”一维码,一维码也叫条形码(好像在日常生活中都是叫这个),它是由不同宽度的黑条和白条按照一定的顺序排列组成的平行线图案,它的宽度记录着数据信息,长度没有记录信息,条形码常用于标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等信息,比如大部分食品包装袋背后都会印有条形码。

一维码的编码规则

全球的条形码标准都是由一个叫GS1的非营利性组织管理和维护的,通常情况下条形码由 95 条红或黑色的平行竖线组成,前三条是由黑-白-黑 组成,中间的五条由白-黑-白-黑-白组成,最后的三条和前三条一样也是由黑-白-黑组成,这样就把一个条形码分为左、右两个部分。剩下的 84 (95-3-5-3=84) 条按每 7 条一组分为 12 组,每组对应着一个数字,不同的数字的具体表示因编码方式而有所不同,不过都遵循着一个规律:右侧部分每一组的白色竖线条数都是奇数个。这样不管你是正着扫描还是反着扫描都是可以识别的。

中国使用的条形码大部分都是 EAN-13 格式的,条形码数字编码的含义从左至右分别是前三位标识来源 国家编码 ,比如中国为:690–699,后面的 4 ~ 8 位数字代表的是厂商公司代码,但是位数不是固定的,紧接着后面 的 9~12 位是商品编码,第 13 位是校验码,这就意味着公司编码越短,剩余可用于商品编码的位数也越多,可表示的商品也就越多,当然公司代码出售价格也相应更昂贵,另外用在商品上的 EAN-13 条码是要到 国家物品编码中心 去申请的。

二维码

二维码 是在一维码的基础之上扩展出来的,二维码有不同的种类,大体上可以分为这两种 ① 堆叠式/行排式二维条码 ② 矩阵式二维码,其中矩阵式二维码最为流行(下文的二维码指矩阵式二维码),它与一维码所不同的是它的宽度和长度均有记录数据信息,存储的数据量更大,除此之外还增加了“定位点”和“容错机制”。通过“定位点”使读码机正确识别进行解读,所以二维码不管是从何种方向读取都是可以被识别的。

“容错机制”可以在没有识别到全部条码时也能正确推断和还原出原始的条码信息,维码的纠错级别,按照不同的纠错率(全部码字与可以纠错的码字的比率)分为 L (约 7%)、M (约 15%)、Q (约 25%)、H (约 30%) 四个不同的级别。比如下面的「mghio」公众号二维码尽管中间有公众号头像,但是依然可以正确识别出来就是这个“容错机制”的功能。不管是条形码(一维码)还是二维码其本质上都是对信息的编码,区别只是对信息的编码方式有所不同。

二维码的结构

二维码的版本从 1 ~ 40 共 40 个不同的版本,每个版本的基本结构都是相同的,所不同的是每个版本的码元(构成二维码的方形黑白点)数量不同,从版本 1 (21 × 21 码元) 至版本 40 (177 × 177 码元) 依次递增。

二维码可以分为这几不同的功能区域,分别是版本信息格式信息数据及容错定位标志校正标志等主要区域,其中定位标识用来对二维码进行定位,版本信息表示二维码的版本,有 40 种不同版本的二维码,从版本 1 到版本 40 ,每一版本比前一个版本每边增加 4 个码元,数据及容错用于实际保存的二维码数据信息和用于修正二维码损坏带来的错误的纠错码字,二维码的编码规则比较复杂,感兴趣的朋友可以去看看它的编码规范。

普通二维码存在的问题

以上介绍的这种普通二维码只是对文字、网址、电话等信息进行编码,不支持图片、音频、视频等内容,且生成二维码后内容无法改变,在信息内容较多时生成的二维码图案复杂,不容易识别和打印,正是由于存在这些特性故称之为静态二维码。静态二维码的好处就是无需联网也能识别,但是有些时候在线下场景经常需要打印二维码出来让用户去扫码,或者在一些运营场景下需要对用户的扫码情况进行数据统计和分析,再使用普通的二维码就无法提供这些功能了,这时候就要使用动态二维码了。

动态二维码(活码)及其原理

动态二维码也称之为活码,关键就在于“活”,“活”就是内容可变,但是二维码不变。活码的优点其实就是静态二维码的缺点,支持随时修改二维码的内容且二维码图案不变,可跟踪扫描统计数据,支持存储大量文字、图片、文件、音视、视频等内容,同时生成的图案简单易扫。

实际上二维码是按照指定的规则编码后的一串字符串,通常大部分情况下是一个网址,在二维码出现之前,我们访问一个网址是打开浏览器输入网址后按下回车即可访问相应的网站,而有了二维码之后,我们使用软件扫描二维码,软件首先会做一次从二维码到文本的解析、转换,然后根据解析出来的文本结果判断是否是链接,是则跳转到这个链接,尽管对我们而言操作方式改变了,但其原理是相同的。

既然二维码背后是网址,要解决静态二维码生成后内容无法修改的问题,是不是只要把网址做成“活的”就行了,即可操控内容的链接,对外暴露的依然还是同一个网址,服务端只需要对这个网址做个二次跳转就行,实际上“活码”就是这么干的,这个对外暴露固定不变的网址也称为“活址”。此时脑海里浮现着计算机科学界一句著名的话:

计算机科学的任何一个问题,都可以通过增加一个中间层来解决。

上面的这个“活址”就是一个“中间层”的角色,屏蔽和隔离了二维码内容的变化,对外始终都只是暴露一个固定的网址。

静态二维码和动态二维码(活码)的区别

比较项 普通二维码 动态二维码(活码)
内容修改 不支持 可以随时修改
内容类型 支持文字、网址、电话等 支持文字、图片、文件、音视、视频等内容
二维码图案 内容越多越复杂 活码图案简单
数据统计 不支持 支持
样式排版 不支持 支持

总结

本文主要对条形码静态二维码动态二维码的一些基本概念做了简单的介绍,想要深入了解二维码的实现细节和原理的朋友可以看看耗子叔的这篇文章 二维码的生成细节和原理 或者到 官网 查看相关文档。虽然现在绝大部分人对于二维码都非常熟悉,几乎每天都会进行着扫码操作,不过在人们的大脑中依然有一个“根深蒂固”的认知,认为一个二维码扫描之后只会出现一种固定的结果,在接触 活码 这个概念之前俺也是。你知道的越多,不知道的也越多。

原文:https://segmentfault.com/a/1190000041250501