关于二维码的一些必备知识点

1,591 阅读4分钟

什么是二维码?

简单来说,二维码就是一种数据的编码方式,和我们熟知的莫尔斯电码是一样的,借助一些方法,我们可以将文本数据转换为二维码,也可以将二维码转换成我们熟悉的文本。


二维码能表示什么类型的数据?

数据都可以用0和1表示,所以二维码理论上可以把任何类型的数据塞进去(甚至是一小段视频),可问题是扫描器能否解析扫描到的数据,而不是把扫描到的数据当成一堆乱码。
目前绝大部分扫描器都会主观的将扫描到的内容转化为文本,因此二维码常用来表示文本数据。


二维码的种类

二维码根据样式可以分为 Data Matrix、MaxiCode、Aztec、QR Code、PDF417、Vericode、Ultracode、Code 49、Code 16K,我们最常见的主要是 QR Code,下面也主要针对QRCode进行分析


什么是QRCode版本?QRCode有多少个版本?

从最直观的角度来讲,QRCode 版本不同,其大小不同。QRCode 有1到40的不同版本(version),每个版本都具备固有的码元结构(码元数)。(码元是指构成QR码的方形黑白点)。

下面是不同版本的二维码:


二维码能表示多少数据?

数据容量取决于 编码方式 + 纠错级别 + 二维码版本,下图为简单示例,即选择 纯数字编码 + 纠错级别为M + 二维码版本为3时,二维码字符容量为101。

完整的表格请见:www.qrcode.com/zh/about/ve…


二维码文本数据格式

之前提到了二维码的识别结果主要是文本,而根据文本格式的不同,扫描器(例如微信,支付宝)又会做出不同的反应(例如打开浏览器,打开通讯录等),常见文本类型有如下:

URL www.baidu.com

联系方式 MECARD:N:1;ORG:1;TEL:1;URL:www.baidu.com;EMAIL:1234567@qq.com;ADR:1 1;NOTE:11;;

电子邮箱 MAILTO:freemouse@email.com

电话号码 TEL:13955555555

短信(SMS) SMSTO:13955555555:你好,二维码发短信

地理位置 GEO:40.71872,-73.98905,100

获取软件(Android) market://details?id=org.example.foo

获取Wifi配置(Android) WIFI:T:WPA;S:mynetwork;P:mypass;;


QRCode的组成

对照上图,我们挑一些重点的来做说明:

  1. 定位图案-Position Detection Pattern
  2. 定位图案-Timing Patterns
  3. 定位图案-Alignment Patterns
    只有Version 2以上(包括Version2)的二维码需要这个东东
  4. 功能性数据-Format Information
    存在于所有的尺寸中,用于存放一些格式化数据的
  5. 功能性数据-Version Information
    在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。二维码版本最直观的感受就是决定了二维码的大小和数据容量。
  6. 正文-正文编码
    常用的主要是Numeric mode 数字编码,Alphanumeric mode 字符编码,Byte mode 字节编码。Numeric mode只能用来表示数字,Alphanumeric mode可以用来表示大写英文字母,数字,$ % * + – . / : 空格。Byte mode 字节编码可以用来表示字节。其中由于Numeric mode只能表示数字,Alphanumeric mode不能表示小写英文字母,因此Byte mode灵活性最好。
  7. 正文-结束码
    标志着正文的结束。
  8. 正文-补齐码
    通过反复添加补齐码使正文长度达到QRCode容量最大限制。
  9. 纠错码 纠错码有四个级别,分别是L,M,Q,H。每个模式纠错力度不同,正因为有纠错码的存在所以破损或不全的二维码也可以识别
等级纠错力度
L水平7%的字码可被修正
M水平15%的字码可被修正
M水平15%的字码可被修正
H水平30%的字码可被修正

QRCode 生成过程

绘制定位图形 -》 绘制功能数据 -》 将正文编码为二进制 -》 追加结束码和补齐码形成正文 -》 生成纠错码 -》 穿插混合正文和纠错码 -》 为上一步混合的数据加掩码来使数据分布的更均衡 -》 将最终结果按照 0白1黑 绘制到二维码图纸上

如果你还有疑问或者想进一步了解QRCode,详见本文的参考   
https://coolshell.cn/articles/10590.html
https://blog.csdn.net/u012611878/article/details/53167009

如何用技术方案(java后台)编解码二维码?

这里推荐使用谷歌的zxing

pom.xml:

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.4.0</version>
</dependency>

QRCodeUtil.java:

// 生成二维码
public static void main(String[] args) {
    Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    try {
        BitMatrix bitMatrix = new MultiFormatWriter().encode("你好 world", BarcodeFormat.QR_CODE, 500, 500, hints);
        MatrixToImageWriter.writeToPath(bitMatrix, "png", Paths.get("D://test.png"));
    } catch (WriterException | IOException e) {
        e.printStackTrace();
    }
}

在线 QRCode 生成/解析


如何生成能亮瞎眼的二维码

python: github.com/sylnsfar/qr…
java: mp.weixin.qq.com/s/5Ja-J0dhJ…


文章参考:
blog.csdn.net/u012611878/…
coolshell.cn/articles/10…
github.com/zxing/zxing
www.cnphp.info/2-d-barcode…
www.cnblogs.com/guorongtao/…
www.qrcode.com/zh/about/ve…
www.swisseduc.ch/informatik/…