QR编码器/解码器中的GS1支持



很少有QR编码器/解码器(明确)支持所谓的GS1编码。Zint是例外之一(在QR选择GS-1数据模式下),但它的许可证阻止我使用它。商业优惠,主要来自Tec it,成本高昂,尤其是因为我对他们支持的所有其他类型的条形码不感兴趣。

有没有一种方法可以在不更改源代码的情况下为任何QR编码器/解码器添加GS1支持例如,我可以应用一些算法将文本GTIN AI数据转换为兼容的二进制数据吗?我认为这应该是可能的,因为毕竟,它仍然是二维码。请注意,我不是数据编码专家——我只是在寻找一种不用花一大笔钱就能处理这个标准的方法。到目前为止,我发现了PostScript条形码,它确实支持它,并且似乎使用了自己的QR引擎,但输出质量一般,我的PostScript技能太有限,无法计算出算法。

只要库支持FNC1特殊字符的解码,就可以用来读取GS1代码。FNC1字符不是数据流中的一个字节,而是一个格式化符号。

规范规定,前导FNC1字符用于识别GS1条形码,应解码为"]d2"(GS1数据矩阵)、"]C1"(GS1-128)、"]e0"(GS1 DataBar全向)或"]Q3"(GS1 QR码)。任何其他FNC1字符都应解码为ASCII GS字符(字节值29)。

根据库的不同,前导FNC1可能丢失,或解码为GS(非关键),或嵌入的FNC1字符可能丢失(关键)。嵌入的FNC1字符用于分隔可变长度字段。

您可以在这里阅读完整的规范(pdf)。解码数据的算法可在标题7.9使用GS1应用程序标识符处理来自GS1符号的数据下找到(第426页)。

算法是这样的:

Peek at the first character.
If it is ']',
If string does not start with ']C1' or ']e0' or ']d2' or ']Q3',
Not a GS1 barcode.
Stop.
Consume the caracters.
Else if it is <GS>,
Consume character.
Else,
No symbology identifier, assume GS1.
While not end of input,
Read the first two digits.
If they are in the table of valid codes,
Look up the length of the AI-code.
Read the rest of the code.
Look up the length of the field.
If it is variable-length,
Read until the next <FNC1> or <GS>.
Else,
Read the rest if the field.
Peek at the next character.
If it is <FNC1> or <GS>, consume it.
Save the read field.
Else,
Error: Invalid AI

QR码中的二进制数据编码为4位令牌,并嵌入数据。

0111 -> Start Extended Channel Interpretation (ECI) Mode (special encodings).
0001, 0010, 0100, 1000 -> start numeric, alphanumeric, raw 8-bit, kanji encoded data.
0011 -> structured append (combine two or more QR Codes to one data-stream).
0101 -> FNC1 initial position.
1001 -> FNC1 other positions.
0000 -> End of stream (can be omitted if not enough space).

编码规范之后是数据长度,后面是实际数据。数据位的含义取决于所使用的编码。在数据块之间,可以压缩FNC1字符。

不幸的是,QR码规范(ISO/IEC 18004)耗资210法郎。不过,你可能会在网上找到一些盗版版本。

要创建GS1二维码,您需要能够在数据中指定FNC1字符。库应该识别"]Q3"前缀和GS字符,或者允许您通过其他方法编写FNC1令牌。

如果你有一些写FNC1字符的方法,你可以按如下方式编码GS1数据:

Write initial FNC1.
For each field,
Write the AI-code as decimal digits.
Write field data.
If the code is a variable-length field,
If not the last field,
Write FNC1 to terminate the field.

如果可能,您应该对字段进行排序,使可变长度字段排在最后。


正如Terry Burton在评论中所指出的;GS1 QR码中的FNC1符号可以在字母数字数据中编码为%,在字节模式中编码为GS。要对实际的百分比符号进行编码,请将其写成%%

要对(01) 04912345123459 (15) 970331 (30) 128 (10) ABC123进行编码,首先将其组合到数据字符串01049123451234591597033130128%10ABC123中(%指示符是已编码的FNC1符号)。然后将此字符串写入

0101 - Initial FNC1, GS1 mode indicator
0001 - QR numeric mode
0000011101 - Data length (29)
<data bits for "01049123451234591597033130128">
0010 - QR alphanumeric mode
000001001 - Data length (9)
<data bits for "%10ABC123">

(ISO 18004:2006规范中的示例)

相关内容

  • 没有找到相关文章

最新更新