很少有QR编码器/解码器具有(显式)支持所谓的GS1编码。 Zint是例外之一(在QR选择GS-1数据模式下),但其许可证阻止我使用它。主要来自Tec-It的商业产品价格昂贵,特别是因为我对他们支持的所有其他类型的条形码不感兴趣。
有没有办法在不更改源代码的情况下为任何QR编码器/解码器添加GS1支持?例如,我可以应用一些算法将文本GTIN AI数据转换为兼容的二进制文件吗?我认为它应该是可能的,因为毕竟它仍然是QR。请注意,我不是数据编码专家 - 我只是在寻找一种方法来处理这个标准,而不需要支付一笔不小的费用。到目前为止,我发现postscriptbarcode确实支持它,并且似乎使用自己的QR引擎,但输出质量一般,而且我的PostScript技能太有限了,无法弄清算法。
答案 0 :(得分:5)
只要该库支持FNC1特殊字符的解码,它就可以用于读取GS1代码。 FNC1字符不是数据流中的一个字节,而是更多的格式化符号。
规范说明领先的FNC1字符用于识别GS1条形码,应解码为"]d2"
(GS1 DataMatrix),"]C1"
(GS1-128),"]e0"
(GS1 DataBar全向)或"]Q3"
(GS1 QR码)。任何其他FNC1字符都应解码为ASCII GS字符(字节值29)。
根据库的不同,前导FNC1可能会丢失,或解码为GS
(非关键),或嵌入的FNC1字符可能丢失(严重)。嵌入的FNC1字符用于分隔可变长度字段。
您可以阅读完整规范here(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 QR码,您需要能够在数据中指定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规范中的示例)