软件系统

Code128 字符集、切换码、功能码完整说明

Admin2026年9月27日

Code128 包含 A/B/C 三套字符集;两种切换机制:Latch 永久切换码(CodeA/CodeB/CodeC)、Shift 临时切换码;4 个功能码 FNC1~FNC4。

一、三套字符集(CodeA / CodeB / CodeC)

起始符决定条码初始字符集:StartA → A 集,StartB → B 集,StartC → C 集

字符集 编码范围 特点 适用场景
Code A ASCII 00~95 大写字母、数字、标点、ASCII 控制字符(NUL、TAB、LF 等);无小写字母 需要传输控制符、纯大写 + 数字
Code B ASCII 32~127 空格、大小写字母、数字、全部可打印 ASCII;不含 0~31 控制符 普通文本,最常用
Code C 00~99 两位数 1 个条码符号编码 2 位数字,密度翻倍;不能编码字母 / 符号 长连续数字串(GS1-128 / 序列号),数字必须成对

重点:CodeC 只接受两位数字一组,遇到奇数个数字时,最后一个数字不能直接用 C 集,需要切 A/B。

二、两种切换规则(Latch 永久切换 + Shift 单次切换)

1. Latch 永久切换码:CodeA (101) / CodeB (100) / CodeC (99)

  • 作用:永久切换字符集,从该切换码之后所有字符,都使用新字符集,直到遇到下一个 Latch 切换码。
  • 跨集方向任意:A→B,A→C,B→A,B→C,C→A,C→B 都支持。
  • 代价:占用 1 个条码符号位置。
  • 适用:连续一长段内容属于另一字符集。

示例:StartB + "ABC" + CodeC + "123456"

  • ABC 用 B 集编码;CodeC 之后全部数字用 C 集,1 个符号存 2 位数字。

2. Shift 临时切换码(值 98)

Shift 仅能在 A ↔ B 之间切换,不能切换到 C 集,C 集内不能使用 Shift

  • 规则:Shift 仅对紧跟在它后面的 1 个字符生效;1 个字符之后自动切回原来字符集。
  • 类似键盘 Shift:只临时改下一个字符,用完恢复。
  • 代价:占用 1 个条码符号。
  • 适用:只有单个字符需要另一字符集,不希望整段切换。

示例:当前 B 集,需要插入一个 A 集的控制字符: B集数据 + Shift + 控制符 + 继续B集数据 Shift 只作用于后面那 1 个控制字符,之后自动回到 B。

选型经验:

  • 连续≥3 个字符需要另一字符集:用 Latch(CodeA/B/C)更省总长度
  • 仅 1 个字符需要另一字符集:用 Shift 更优
  • 2 个字符:Shift 和 Latch 成本一样

三、功能码 FNC1 / FNC2 / FNC3 / FNC4(功能码不代表 ASCII 数据,是给扫描器的指令)

功能码在 A/B/C 字符集内都存在,不会被当作普通文本返回给上位机,而是作为扫描器的控制指令。

  1. FNC1(值 102)
    • 最常用:放在起始符之后,代表 GS1-128(EAN-128),用于 GS1 应用标识符 AI 条码。
    • GS1 规范:FNC1 还用作可变长度字段分隔符,当 AI 字段不定长时,FNC1 标记字段结束。
  2. FNC2
    • 消息拼接:扫描器把包含 FNC2 的这串数据缓存,下次扫码时,把缓存内容作为前缀,拼接本次扫码数据一起上传。
  3. FNC3
    • 扫码器初始化指令:读到 FNC3,扫描器执行预设的初始化 / 编程动作,条码本身数据不上传。多用于扫描枪配置条码。
  4. FNC4
    • 扩展 ASCII:下一个字符编码为 ASCII 128~255(原 ASCII 值 + 128)。
    • 现代应用极少使用,很多扫描器不支持。

注意:FNC 是条码内部符号,扫描输出文本默认不会输出 FNC 字符,只有 GS1-128 场景部分驱动会特殊标记 FNC1。

四、Code128 完整条码结构

静区 → Start (A/B/C) → [FNC1 可选] → 数据 (含 Latch/Shift/FNC) → 校验码 (Mod103) → Stop 终止符

  • 校验码:对起始符 + 所有数据符号(包含 Latch、Shift、FNC)加权求和,模 103。
  • Stop 终止符固定图案,13 模块,不能用 A/B/C 字符集编码。

五、典型切换例子

例 1:StartB + "A123{CodeC}456789"

  • StartB:初始 B 集,A123 用 B 集;
  • CodeC(Latch):永久切 C 集;45,67,89 三组两位数,C 集高密度编码。

例 2:StartB + "ABC{SHIFT}{控制符}DEF"

  • ABC B 集;SHIFT 只把后面 1 个字符用 A 集解析(控制字符);DEF 自动回到 B 集。

例 3:GS1-128:StartC + FNC1 + AI+数字

  • StartC,紧跟 FNC1,标记 GS1-128 条码。

六、编码设计要点

  1. 长串数字优先切 CodeC,压缩条码长度;数字必须成对,奇数尾数字要切 A/B。
  2. 遇到小写字母,必须在 B 集。
  3. 遇到 0~31 控制字符,必须在 A 集。
  4. Shift 只能 A↔B;不能用于切换 C;想要切 C 只能用 CodeC Latch。
  5. 每一次 Latch/Shift/FNC 都占用一个符号,会增加条码长度,编码器要做代价评估自动选最优切换策略。