软件系统
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 字符集内都存在,不会被当作普通文本返回给上位机,而是作为扫描器的控制指令。
- FNC1(值 102)
- 最常用:放在起始符之后,代表 GS1-128(EAN-128),用于 GS1 应用标识符 AI 条码。
- GS1 规范:FNC1 还用作可变长度字段分隔符,当 AI 字段不定长时,FNC1 标记字段结束。
- FNC2
- 消息拼接:扫描器把包含 FNC2 的这串数据缓存,下次扫码时,把缓存内容作为前缀,拼接本次扫码数据一起上传。
- FNC3
- 扫码器初始化指令:读到 FNC3,扫描器执行预设的初始化 / 编程动作,条码本身数据不上传。多用于扫描枪配置条码。
- 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 条码。
六、编码设计要点
- 长串数字优先切 CodeC,压缩条码长度;数字必须成对,奇数尾数字要切 A/B。
- 遇到小写字母,必须在 B 集。
- 遇到 0~31 控制字符,必须在 A 集。
- Shift 只能 A↔B;不能用于切换 C;想要切 C 只能用 CodeC Latch。
- 每一次 Latch/Shift/FNC 都占用一个符号,会增加条码长度,编码器要做代价评估自动选最优切换策略。