GS1条形码中FNC1字符的实际ASCII值是多少?

13

我在维基百科和GS1官方规范上搜索过很多页面,但仍然没有找到关于这个问题的明确答案。

GS1 FNC1字符的实际16进制/二进制值是多少?

有关如何使用GS1标识符、如何使用ZPL打印条形码以及如何编码FNC1的信息很多,但我想知道该字符的实际16进制值。

2个回答

31

特殊功能字符,如FNC1到FNC4属于“非数据字符”类别,可以在各种条形码符号中进行编码,但在解码数据流中没有任何直接的ASCII表示。支持这些字符的每个符号系统都有一种不同的方案来对它们进行内部表示,这与任何面向字节的字符数据都有很大的区别。

FNC字符既作为标志字符(指示读取器的某些特殊信息),也作为格式化字符(修改编码数据的含义)。因此,它们不打算直接传输到基本条形码读取器从主机系统接收到的数据中,尽管在两种情况下,它们可能会对传输的消息产生“影响”。

每个FNC字符的通常目的如下:

  • FNC1 - 结构化数据的标志字符,指示GS1和AIM格式以及组分隔符等格式化字符的使用。
  • FNC2 - 消息附加的标志字符,用于将数据缓冲在符号组中进行单次读取。
  • FNC3 - 读取器编程的标志字符,用于设备配置目的。
  • FNC4 - 扩展ASCII格式化字符,用于对序数为128-255的字符进行编码。

请注意,某些条形码符号可能并不支持所有这些字符,并且甚至可能以不同的、非典型或过载的方式指定它们。

通过特定于编码软件的“转义机制”,可以在符号的内部数据中对FNC字符进行编码。每个库都有一种不同的方式来接受它们输入中的这些非数据字符。例如,为了在其典型的GS1结构化数据角色中使用FNC1,用于数据“(01)00312345678906(21)123456789012(30)0144”,您可能会看到FNC1字符被转义为{ FNC1 },以便输入看起来像{ FNC1 } 010031234567890621123456789012 { FNC1 } 300144

一些库甚至会使用一组常规或扩展的ASCII字符作为FNC字符的占位符,但这些是任意表示方法,认为它们是这些非数据字符的实际ASCII值是错误的。

扫描条形码后,符号的内部数据通常会被解码,然后通过基本通道(例如键盘楔)作为字节序列传输到主机以根据Latin-1字符编码进行解释。这样的方式无法表示FNC字符,并且将其排除在数据流之外,但是它们对数据的格式化效果仍然存在。

例如,大多数符号编码的标准规定,在符合GS1应用标识符标准格式的数据中,当FNC1字符被用作字段分隔符时,应将其解码并传输为GS(ASCII 29)。明确说明,FNC1字符作为GS1应用标识符分隔符使用的格式化效果是在可变长度字段末尾放置GS字符。但在其他角色中(例如当FNC1作为“第一/第二位置”的标志字符和非GS1格式数据一起使用时),对所传输数据没有格式化效果,因此在解码过程中没有ASCII表示。
另一个特殊功能字符对数据具有格式化效果的实例是使用FNC4将符号编码从7位ASCII扩展到扩展ASCII,如this answer中所述。
一个微妙的技术点是,传输到主机的数据通常以短符号标识头为前缀,称为“符号标识符”,它表示正在读取数据的符号的类型和用途。这通常通过符号数据中存在的不可见标志字符进行修改,例如指示具有“FNC1在第一位”的GS1格式数据的存在,或者当FNC3出现在符号中的任何位置时指示读取器编程模式。详细信息取决于符号规范。
此外:除了FNC非数据字符之外,条形码符号学通常支持其他没有直接ASCII表示但影响整个消息的非数据字符。这些包括宏字符(将消息数据包装在数据字符“信封”中)和ECI指示符,它们需要使用超出典型的“基本通道”模式的传输协议,但可以使用扩展字符集等增强功能。

有趣。但是,如果某个系统不知道交付系统如何编码FNC1,那么以一种方式编码的条形码如何被正确地读取为GS1?您详细介绍了解码过程,那么编码过程呢?假设我正在编写一个生成GS1条形码的系统,当生成这些数据时,我应该使用什么值来表示FNC1?您从哪里获取了关于ASCII 29 / GS的编/解码信息? - F.P
1
我已经扩展了答案以处理编码。关于我的信息来源,自ISO/IEC 15417(Code 128)以来,几乎每个ISO条形码规范都包含以下内容:“当FNC1在第一或第二位置使用时,它不应在传输的消息中表示... FNC1在第三个或后续字符位置上作为控制字符GS(值29)进行传输。”(ISO/IEC 15417:2007附录B.4)。您可以在免费提供的GS1通用规范中看到多个有关FNC1解码的参考资料。 - Terry Burton
非常简洁有用的信息。比我迄今在互联网上找到的任何东西都要好得多。非常感谢。 - F.P

1
重要的是要知道(并正确设置扫描仪),第一个位置的FNC1字符将根据ISO/IEC 15424翻译为符号标识符。符号标识符的修饰符m显示是否有FNC1。如果不这样做,应用程序将无法确定是否打算使用GS1结构。其他结构可以通过例如数据矩阵码中的Macro 06(ISO/IEC 16022、ISO/IEC 15434)来识别。需要弄清楚差异以采取正确的操作来处理数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接