王毅 邓惠朋 董晓文/文
本世纪初,为解决PDF417、QR等国外码制不支持中国汉字以及汉字信息表示效率不高等问题,中国物品编码中心(以下简称编码中心)牵头我国企业共同研发了“汉信码”二维码码制。2007年,GB/T 21049-2007《汉信码》国家标准正式发布,2011年汉信码成为国际AIM Global权威行业标准,2015年,汉信码正式成为国际ISO标准项目。2021年,ISO/IEC 20830《信息技术 自动识别与数据采集技术汉信码条码符号规范》国际标准正式发布,标志着中国人具有了完全自主知识产权的二维码码制技术,实现了我国又一底层技术的零的突破。
汉信码是我国第一个制定了国家标准并且拥有自主知识产权的二维码,如图1所示,在汉字信息表示方面汉信码达到国际领先水平,在数字和字符、二进制数据等信息的编码效率、符号信息密度与容量、识读速度、抗污损能力等方面达到了国际先进水平。经历十余年的打磨,ISO版汉信码相比2005年研发完成时的技术更为成熟。ISO汉信码在技术上完全涵盖并兼容原有汉信码(指GB/T 21049 2007)国家标准中规定技术,还增补扩展了Unicode模式、URI模式、GS1模式三个针对重要应用领域的新型信息编码与译码模式,大幅提高了汉信码针对我国国际化应用的适用性,填补了国际二维码码制在这些领域的空白。
图1 汉信码码图外观
汉信码技术的设计与工程实现是在理论和技术研究基础上,针对我国二维码应用的切实问题进行的不断自主创新,因此,汉信码在技术方面不仅综合了各个码制的优势,更能够在许多方面推陈出新,实现后发优势。
在码图设计、纠错能力以及信息编码方面,汉信码注重在识读速度、码制可靠性与信息密度和容量的统筹兼顾,实现了汉信码在信息编码、纠错能力与符号抗畸变的完美平衡,如图2所示。
图2 汉信码码图结构
汉信码具有九大技术优势,具体如下:
作为完全自主创新的一种二维码码制,汉信码的九项技术专利成果归编码中心所有。编码中心早在汉信码研发完成时即明确了汉信码专利免费授权使用的基本原则,更不需要向编码中心以及其他任何单位缴纳专利使用费。汉信码具有完全自主知识产权,《纠错编码方法》《数据信息的编码方法》《二维条码编码的汉字信息压缩方法》《生成二维条码的方法》《二维条码符号转换为编码信息的方法》《二维条码图形畸变校正的方法》《汉信码的物流信息编码方法、装置及设备》《字符串编码的方法和装置》《编码方法、装置、设备及计算机可读存储介质》等9项核心发明专利,全部免费公开,使用汉信码不存在任何专利问题,没有任何的专利风险与专利陷阱。
由于考虑了物流等实际使用环境会给二维码符号造成污损,同时由于识读角度不垂直、镜头曲面畸变、所贴物品表面凹凸不平等原因,也会造成二维码符号的畸变。为解决这些问题,汉信码在码图和纠错算法、识读算法方面进行了专门的优化设计,从而使汉信码具有极强的抗污损、抗畸变识读能力。现在汉信码能够在倾角为60度情况下准确识读,能够容忍较大面积的符号污损。因此汉信码特别适合在物流等恶劣条件下使用,如图3所示(见下页)。
图3 汉信码污损畸变符号识读
为提高二维码的识读效率,满足物流、票据等实时应用系统的迫切需求,汉信码在信息编码、纠错编译码、码图设计方面采用了多种技术手段提高了汉信码的识读速度,目前汉信码的识读速度比国际上的主流二维码Data Matrix要高,因此汉信码能够广泛地在生产线、物流、票据等实时性要求高的领域中应用。
根据汉信码自身的特点以及实际应用需求,采用最先进的Reed-Solomon纠错算法,设计了四种纠错等级,适应于各种应用情形。此外,为适应二维码的各类应用环境,汉信码对于各版本和各纠错等级的纠错分组和信息排布进行了专门优化,在容错性能和计算速度上实现了平衡,最大纠错能力可以达到30%,在性能上接近并超越现有国际上通行的主流二维条码码制。
为提高汉信码的信息表示效率,汉信码在码图设计、字符集划分、信息编码等方面充分考虑了这一需求,从而提高了汉信码的信息特别是汉字信息的表示效率,当对大量汉字进行编码时,相同信息内容的汉信码符号面积只是QR码符号面积的90%,是Data Matrix码符号的63.7%。
汉信码最多可以表示7829个数字、4350个ASCII字符、2174个汉字、3262个8位字节信息,支持照片、指纹、掌纹、签字、声音、文字等数字化信息的编码。
汉信码是目前唯一全面支持我国汉字信息编码强制性国家标准GB 18030-2005《信息技术中文编码字符集》的二维码码制,能够表示该标准中规定的全部常用汉字、二字节汉字、四字节汉字,同时支持该标准在未来的扩展。在汉字信息编码效率方面,对于常用的双字节汉字采用12位二进制数进行表示,在现有的二维码中表示汉字效率最高。
此外,ISO版汉信码扩展支持了Unicode压缩模式,这一新模式在保持汉信码汉字高效编码的基础上,极大提高了汉信码支持多种语言文字的信息编码能力。
因此,汉信码是表示汉字信息的首选码制。
目前二维码的应用热潮,主要是由于二维码的移动应用推动起来的,通过手机扫描或手机展示二维码,实现购物、乘车、健康码等应用已经成为大众生活的主流,这些二维码中承载的内容主要是URL,俗称网址。URL是URI,即统一资源标识符的一种形式,用于在规定的网络协议下进行资源定位。这些二维码中的URI通常为短URI,用户通过扫描二维码获取URI,通过APP定义的方式引导用户访问网络资源,二维码已经成为事实上的移动商务入口。
现有的二维码,如日本的QR码等并没有针对目前如此广泛的二维码移动应用进行优化,现有码制仅仅将网址视为由字母、数字、其他字符组成的字符串进行编码,且大多采用效率最低的8字节编码模式,造成编码空间的浪费,损失编码效率。
针对目前二维码主要的网址应用模式,汉信码ISO标准中设计采用了高效的URI编码模式。相同的网址,使用汉信码较其它码制的编码效率更高,码图面积更小。例如,对于网址:https://www.ten⁃cent.com/zh-cn/index.html的编码符号,汉信码(图4 A)的模块数为25×25,QR码(图4 B)的模块数为29×29,相同模块大小的前提下,汉信码面积仅为QR码的74%,如图4所示。
图4 汉信码仅为QR码面积的74%
某些特殊网址,汉信码编码效率更高,编码信息序列长度甚至仅为QR码的一半,甚至更低。这对提高二维码识读效率,小包装商品的二维码印制,降低企业印制成本具有积极的现实意义。
针对目前国际主流的GS1编码,ISO版汉信码也增加了GS1模式,高效承载GS1编码。GS1 Global主席米盖尔公开表示支持汉信码码制上升成为国际GS1二维码码制之一。
由于二维码具有信息容量大、成本低廉等优势,二维码技术应用目前已经形成全球性的热潮,而在以二维码作为描述性、文字类数据载体的应用中,由于各国采用的语言文字不同,从而造成在某一个国家编制生成的二维码,在另一个国家译码时,由于应用软件、操作系统采用的编码字符集不同,出现二维码译码结果为乱码的现象,这对二维码技术的全球性广泛应用造成了严重阻碍。
引起这一问题的原因主要是历史遗留的文字信息编码问题。在全球信息化过程中,由于各种原因,语言文字的编码采用的技术方案各不相同,在早期的7位、8位编码以及16位编码阶段,过渡到目前的基于多个编码平面的各类大字符集过程以及主流应用软件和操作系统的升级过程中,各个主要国家都累积了不同的信息编码字符集。汉字在日本、韩国等汉字集中同样存在,不同的字符集编码中,同样的汉字编码不同,同一个编码取值,指代的字符不同,同时这些字符集的应用主要表现为确定区域的特色。在文字编码中,汉字编码是最为复杂的问题之一,除了我国的GB 2312、GB 18030字符集之外,日本、韩国的现行字符集中也包含了大量汉字。据不完全统计,目前国际上已经存在的编码字符集有数百个,相关字符集内的字符码位与相互映射关系非常复杂,跨系统的信息交互采用两个字符集间的映射不大可行。
为解决多国文字的自适应高效编码问题,产业界研发了Unicode(统一码、万国码、单一码)业界标准,并同步修订完成了ISO/IEC 10646标准。Uni⁃code是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。Unicode是一张非常巨大的字符码表,每个字符都赋予了“U+”开头的编号,例如:U+4E25为汉字“严”字;Unicode的唯一字符编码,可以采用多种方式编码为二进制形式,如UTF-8、UTF-16、UTF-32等,且其中UTF-8是最通用、支持最广泛的字符编码。
为解决二维码字符编码在译码时的问题,编码中心开展了汉信码信息编码技术研究,通过研究发现全面支持各类语言高效编码的实现路径应采用全面支持Unicode的方式实现,从而开发了Unicode压缩模式,这一新模式在保持汉信码原有的汉字等多种文字高效编码的基础上,极大提高了汉信码支持多种语言文字的信息编码能力。目前,汉信码是第一个也是唯一一个同时支持英文、日文、德文、阿拉伯文、希伯来文等全系列语言文字高效编码的码制,能够实现针对多国文字的自适应高效编码。
汉信码强大的技术优势源自于底层严密的技术设计,码图设计决定了抗污损、抗畸变能力和快速的识读水平,URI模式极大提高了网址表达效率,更加符合网络时代下二维码作为网址跳转载体的现实应用需求,Unicode模式则解决了多国文字的自适应高效编码问题,成为唯一能够实现全球任意语言表达的二维码码制。
码图分为功能图形区和编码信息区。为了达到快速定位的目的,汉信码采用扫描特征比例的方式进行码图寻像与定位,码图寻像图形由位于码图四个角上的位置探测图形组成。码图的校正图形是由黑白两条线组成阶梯形的折线,通过折线的交点来达到分块校正码图的目的。为了能有效利用码图编码空间,版本设计时,相邻版本之间的模块变化为每边相差2个模块。在信息编码区,将数据码字和纠错码字按照一定的编排规则组合后对码字进行交织编排,并按指定的布置规则进行码图布置。同时,为了使信息编码区符号的黑白模块比例均衡,尽量减少影响图像快速处理的图形出现,对编码信息区添加掩模,使黑白模块的比例接近1:1。其功能信息区则布置着码图的版本信息、纠错等级、掩模方案等。
寻像图形包括四个位置探测图形,分别位于符号的左上角、右上角、左下角和右下角,如图5所示(见下页)。各位置探测图形形状相同,只是摆放的方向不同,位于右上角和左下角的寻像图形摆放方向相同,这样设计的目的是为了使整个码图有明显的方向特性。以左上角的位置探测图形为例,它的大小为7×7个模块,整个位置探测图形可以理解为将3×3个深色模块,沿着其左边和上边外扩1个模块宽的浅色边,后继续分别外扩1模块宽的深色边、一个模块宽的浅色边、一个模块宽的深色边所得。其扫描的特征比例为1:1:1:1:3和3:1:1:1:1(沿不同方向扫描所得值不同)。符号中其它地方遇到类似图形的可能性极小,可以在视场中迅速识别可能的码制符号。识别组成寻像图形的四个位置探测图形,可以明确地确定视场中符号的位置和方向。
图5 寻像图形结构图
定位图形设计
从对QR、DataMatrix等各种二维码的分析来看,通过对具有简单几何比例特征的模式进行多方向扫描的方式是最简单快速的解码方式。
为了定位上的快捷方便,在码图的四个角上各放置一个定位图形,并确定了定位图形在码图中的放置方式,这样放置不仅保证码图具有对称性,同样能体现汉信码的方向性,使得汉信码的码图具有明显的不同于已有二维码的特征,而且使得汉信码具有更好的快速定位的能力,如图6所示。
图6 汉信码定位图形放置
定位图形位于符号的4个角上。各元素的相对宽度的比例是1:1:1:1:3或3:1:1:1:1,因此需要同时探测的比例是1:1:1:1:3和3∶1∶1∶1∶1。在水平和垂直方向寻找满足1:1:1:1:3或3:1:1:1:1比例的模式,搜索结果即为图像的四个定位符号的位置信息。设条码区图像为G(x,y),条码在图像中的高度和宽度分别记为H、W,图像二值化时的阈值为 T,得到条码的边界 E(x1,x2,…xw)时,即
从当前位于 E(x1,x2,…xw)上的边界点出发,搜索并得到从X轴方向和Y轴扫描图像中的比例是1:1:1:1:3或3:1:1:1:1的模式,则为汉信码的寻像符号的特征模式。
校正图形设计
对于一种码制来说,通常会采用定位图形和校正图形相组合的方式来达到抗畸变能力。在汉信码符号较大的情况下,需要增加校正图形,采用分区的方式将二维码分成小区域。因为符号较大时,整体可能会产生较大的畸变,但是小区域内的畸变会相对较小,这样才能保证汉信码的抗畸变能力。
汉信码的校正图形由一组或几组单模块宽,长度不同的临接连续深浅模块(简称校正折线)组成的,横竖连续排布的阶梯形折线,以及排布于码图四个边上的2×3(5个浅色,1个深色)个模块组成的辅助校正图形共同构成,如图7-1、7-2、7-3所示(见下页)。对于某一个汉信码符号版本,校正图形折线的长度(连续模块数)取值有两种,其中码图最左边与最下边区域的校正折线长度(宽度)取特殊值r,而剩余区域的校正折线长度(宽度)为k。当校正折线位于符号边缘时,校正折线设定为单模块宽的深色连续模块。辅助校正图形为2×3(或3×2)个模块组成的,位于码图边缘的特殊图形,其中符号边缘的3模块序列中心模块为深色,其余模块为浅色,深色模块位置位于附近校正折线延长线与符号边缘相交的模块位置。对不同版本的码图,其校正图形的排布各有差异,各版本校正折线的r与k的值以及平分为k模块宽的个数m取值满足关系:n=r+m*k(n≥3),(详见汉信码国家标准)。而对于版本小于3的码图,则没有任何校正图形。
图7-1 汉信码的校正图形
图7-2 校正图形的中心坐标
图7-3 辅助校正图形的中心坐标
URI是互联网工程方面的标准化组织IETF制定的RFC3986标准中规定的统一资源标识符语义结构,由协议、主机名、域名、默认端口号、资源路径等组成,顺序与结构固定,然而相关真正使用的协议域名等相对很少,将各部分单独进行编码,可极大提高编码效率。
汉信码的URI模式是专门针对二维码的移动应用量身定制的一种信息编码模式。将字符按照使用频率分为三个字符集,分别为URI-A,URI-B,URI-C。其中URI-A是最常用的字符集,包含小写字母、数字、部分协议头、常用顶级域名等62个最常用字符,满足大部分URI编码需求,可满足大部分短网址的查找需求。URI-B则涉及百分号编码、ASCII中的其他符号、GS1关键字等。URI-C可视为A和B的总集,在大多数情况下,只需查找URIA字符集中的62个字符,并结合URI-B中的百分号编码,即可完成一个URI的编码或解码。通过这种方式,极大提高了二维码承载短网址的效率,相同的网址,使用汉信码较其它码制的编码效率更高,码图面积更小。
汉信码URI模式的模式指示符为(1110 0010)bin,URI模式的模式结束符为(111)bin。
输入的URI字符串的分析方法和步骤如下:
a)按照下述规则对输入的URI字符串进行分析,查找并记录输入URI字符串的每个字符或字符序列的初始编码:
1)如果字符“%”后面有两个字符,并且这些“%XX”字符序列符合RFC 3986定义的百分号编码的要求,则对这些“%XX”字符使用百分号编码字符方法。
2)如果字符或字符序列可以使用URI-A字符集和URI-C字符集进行编码,则首选使用URI-A字符集。
3)如果字符或字符序列可以使用URI-B字符集和URI-C字符集进行编码,则首选使用URI-B字符集。
4)如果使用URI-A字符集在同一位置对字符或字符集序列进行编码有两种方式,则使用编码值较大的方法作为首选方法。
5)如果使用URI-C字符集有两种方法在同一位置对字符或字符集序列进行编码,则使用编码值较大的方法作为首选方法。
b)用a)进行初步分析之后,对数据分析结果进行优化步骤如下:
1)如果字符串使用URI-A字符集和URI-B字符集共同进行编码,计算共计产生的编码位数。计算单独使用URI-C字符集对该字符串进行编码产生的编码位数。只有在前者小于或等于后者时,才使用URI-C字符集进行编码。
2)如果字符串使用URI-B字符集和URI-A字符集进行编码,计算共计产生的编码位数。计算单独使用URI-C字符集对该字符串进行编码产生的编码位数。只有在前者小于或等于后者时,才使用URI-C字符集进行编码。
3)如果字符串使用URI-A字符集和URI-C字符集进行编码,计算共计产生的编码位数。计算单独使用URI-C字符集对该字符串进行编码产生的编码位数。只有在前者小于或等于后者时,才使用URI-C字符集进行编码。
4)如果字符串使用URI-B字符集和URI-C字符集进行编码,计算共计产生的编码位数。计算单独使用URI-C字符集对该字符串进行编码产生的编码位数。只有在前者小于或等于后者时,才使用URI-C字符集进行编码。
5)如果字符串使用URI-C字符集和URI-A字符集进行编码,计算共计产生的编码位数。计算单独使用URI-C字符集对该字符串进行编码产生的编码位数。只有在前者小于或等于后者时,才使用URI-C字符集进行编码。
6)如果字符串使用URI-C字符集和URI-B字符集进行编码,计算共计产生的编码位数。计算单独使用URI-C字符集对该字符串进行编码产生的编码位数。只有在前者小于或等于后者时,才使用URI-C字符集进行编码。
7)重复上述步骤中描述的步骤,直到不再进行优化。
根据以上分析结果,用字符集指示符和相应的字符集对输入的URI字符串进行编码,字符集指示符编码,见表1(下页):
表1
汉信码的Unicode模式的主要技术过程是,对Unicode字符集的UTF-8编码模式,采用自适应游程编码的数据编码模式,将其转换为汉信码的数据码字流。在将Unicode转换为汉信码信息编码过程中,设立了4种编码格式(1字节格式、2字节格式、3字节格式和4字节格式),分别对UTF-8字符集采用不同编码模式进行预编码,对所得到的预编码长度进行比较,选取最有效的编码模式,从而有效保证了编码效率。汉信码是目前已经标准化的ISO各种二维码码制中唯一支持Unicode模式编码的码制,同时编码效率进行了充分优化,编码效率与原固有信息编码模式效率相近或更优。输入数据由可用1字节、2字节、3字节或4字节表示的字符组成。Unicode模式应按照自适应数据分析算法分析输入数据。首先,将输入数据划分并组合成1字节格式、2字节格式、3字节格式或4字节格式预编码子序列,然后按照游程数据压缩算法对输入数据的每个子序列进行编码。使用以下步骤分析编码数据:
a)对输入数据进行初步分析,得到初始字节模式分析结果:
1)读取数据的前12个字节进行分析:
①如果整个数据长度小于12字节,则跳转到③;否则,转到下一步。
②使用1字节格式、2字节格式、3字节格式和4字节格式对前12字节数据进行编码,选择同字节格式中(编码位/字节计数)具有最低预编码比特率的字节模式作为前12字节的初始字节模式。如果此字节模式为4字节格式,则转到⑧;否则,转到下一步。
③读取前9个字节的数据,如果整个数据长度小于9个字节,则转到⑤;如为9个字节,转到下一步。
④使用1字节格式、3字节格式预编码前9字节数据,选择同字节格式中编码比特率最低的字节模式作为前9字节的初始字节模式。如果此字节格式为3字节格式,则转到⑧;否则,转到下一步。
⑤读取前6个字节的数据,如果整个数据长度小于6个字节,则转到⑦;如满足6个字节,转到下一步。
⑥使用1字节格式、2字节格式预编码前6字节数据,选择字节编码比特率最低的字节模式作为前6字节的初始字节模式。如果此字节格式为2字节格式,则转到⑧;否则,转到下一步。
⑦使用1字节模式作为第一个字节的初始字节模式。
⑧利用初始数据字节序列中的初始字节模式,将数据的下一个分析位置设置为初始字节序列的下一个字节。
2)对于下一段数据分析位置,如果到达数据的末尾,则初始分析结束;否则,读取下一个12字节的数据,进行分析:
①如果下一个分析位置的整个数据长度小于12字节,则转到③;如长度满足12字节,转到下一步。
②使用1字节格式、2字节格式、3字节格式和4字节格式预编码接下来的12字节数据,选择同字节格式中(编码位/字节计数器)编码比特率最低的字节格式作为下一个12字节的初始字节格式。如果此字节模式为4字节格式,则转到⑧;否则,转到下一步。
③读取头9字节的数据,如果该数据长度小于9字节,则转到⑤;否则,转到下一步。
④使用1字节格式、3字节格式对该9字节数据进行编码,选择同字节格式中编码比特率最低的字节模式作为9字节的初始字节格式。如果此字节模式为3字节格式,则转到⑧;否则,转到下一步。
⑤读取头6个字节的数据,如果下一个分析位置的整个数据长度小于6个字节,则转到⑦;否则,转到下一步。
⑥使用1字节格式和2字节格式对该6字节数据进行编码,选择同字节格式中编码比特率最低的字节格式作为该6字节的初始字节模式。如果此字节格式为2字节格式,则转到⑧;否则,转到下一步。
⑦使用1字节格式作为下一个字节的初始字节格式。
⑧如果数据系列的初始字节模式与先前数据字节系列的先前初始字节模式不同,则将初始字节模式设置为数据系列的数据模式,并通过增加字节序列的长度来移动数据的下一个分析位置,返回2;否则,如果数据字节序列的初始字节模式与先前数据的先前初始字节模式相同,则分析并决定是否将两个数据字节序列合并为一个。数据组合分析是为了计算和比较使用两个单独字节模式的编码位以及用于集成到一个单字节序列的编码位:
•如果集成到一个字节序列中的编码位数不大于使用两个单独字节模式的编码位数,则不要更改前一个字节模式进行编码,而是要注意更改每个字节的长度、差值和最小值字节模式;
•如果集成为一个字节模式的编码位数大于使用两个单独字节模式的编码位数,则启动一个新的字节模式进行编码;
•对于上述两种情况,通过添加新的已分析字节模式的长度来移动下一个分析位置。
b)优化初始字节模式分析结果,具体步骤如下:
1)如果数据序列与之前的数据序列使用相同的字节模式。计算两个相邻数据序列的两个单独字节模式(不同长度、差值和最小值)的编码位和两个数据序列的单字节模式的编码位:
①如果集成到一个单一字节模式的编码位大于使用两个单独字节模式的编码位,则无需更改字节模式;
②如果集成到一个单一的字节模式的编码位不大于使用两个单独的字节模式的编码位,则将两个单独的字节模式集成为一个单字节模式,但要注意改变长度,差值和最小值的每个字节的字节模式。
2)如果2字节模式的总字节长度小于16。使用两个单独的字节模式(不同的长度、差和最小值)计算两个相邻数据序列的编码位,并使用一个本地单字节模式(1字节模式)计算两个数据序列的编码位:
①如果集成到一个本地单字节模式的编码位不少于使用两个单独字节模式的编码位,则不必更改字节模式;
②如果集成到一个本地单字节模式的编码位少于使用两个单独的字节模式的编码位,则将两个独立的字节模式集成到一个本地单字节模式。
3)重复此步骤中描述的步骤,直到无法进行任何优化为止。
利用以上的分析结果,使用以下步骤对输入数据进行编码:
a)对于1、2、3或4字节格式的每个数据序列,选择相应的字节格式指示符作为编码的起始位,见表2。
表2
b)Unicode模式下字节模式计数器的编码格式见表3,对该字节模式的数据序列的字节格式计数器进行编码(字节模式计数器基于字节模式,而不是字节长度,例如计数器2的3字节模式具有6字节):
表3
c)找出每个1、2、3或4字节分组的字节序列最小值,计算并重新编码1、2、3或4字节组的每个字节序列与分组字节序列最小值相比的所有差异。此外,需要将1、2、3或4个字节各字节分组的差异长度标识符添加到编码位流中,该指示符采用不同的长度表示方法可以支持多个字节分组差异值的长度。