我正在尝试验证使用ZXing或ZBar扫描的GS1条形码。GS1通用规范在7.8中规定,GS1条形码必须使用特定的符号标识符进行传输:
]C1
=GS1-128]e0
=GS1数据条和GS1复合符号]d2
=GS1数据矩阵]Q3
=GS1二维码
但ZXing只显示Code128(带或不带--gs1
)的符号标识符,而不显示其余部分的符号标识符。ZBar根本不显示符号标识符。
我对规范的理解正确吗?
有没有办法用ZXing或ZBar从条形码中提取这些标识符?
通常的手持扫描仪会看那些符号识别器吗?
您对规范的理解确实是正确的。这些库不遵循传输协议;FNC1处于第一位置";,即GS1模式。
条形码符号体系标准是规定性的:修改后的AIM符号体系标识符的传输是通用ISO符号体系标准的强制性部分,而不仅仅是GS1应用标准。
这些单独的标准没有试图描述传输协议运行的总体框架,让读者根据不完整的画面猜测某些决定的原因。此外,由于历史原因,这些标准预设了一种假设情况,即条形码读取器通过物理字节模式接口连接到主机。
手持扫描仪通常可以配置为发送AIM符号标识符(或某些专有等效标识符)作为传输消息的前缀,并且通常会严格遵守规定的传输协议。
然而,现在典型的解码器开发人员正在为既承载最终用户应用程序又包括集成相机的设备编写库;金属丝";在其上执行传输协议是不存在的。开发人员省略了意图不明确的标准的基本功能是可以理解的,但这样做会在解码某些类型的数据时产生歧义。
某些类型的数据,如GS1应用程序标识符语法,需要一个明确的激活标志,该标志通过修改AIM符号识别器的方式以规范的方式发出信号。解码器库的API除了识别扫描条形码的通用格式之外,很少能完全替代符号标识符所指示的特征。例如,设备API通常缺少GS1模式和ECI协议扩展的信令。
一个相关的问题是,解码器库经常省略将条形码消息的第三个和随后的字符位置中的FNC1字符作为GS(ASCII值29)发送,使得GS1AI语法消息的解码不可能。甚至更少的图书馆传输"%"QR码符号中的字符,其中GS1模式被激活为GS。这些实现方式根本不符合符号学标准。
ZXing到C++端口的维护人员(ZXing cpp)正在积极与条形码标准制定社区合作,以确保正确遵守符号标准。因此,ZXing(Java)以及包装器和绑定生态系统应该在适当的时候从这些改进中受益。