标签上某几个字打不出来:预览里明明有,打出来是空白;或者变成一个空心方框;或者干脆被跳过,后面的内容往前挤了一格。这类现象和「整段文字字体被换掉」「中文整串变成乱码」看起来像,成因和排查入口完全不同,用错入口会白换好几轮字体。
本文讲的是缺字这一类:绝大多数字符都正常,只有少数字符出问题。如果你的情况是整段文字的字体变了、字宽跟着变,请看《Brady Workstation 模板偏移与字体丢失排查》;如果中文整串变成别的汉字或问号,请看《Codesoft 序列号不递增与数据库字段错乱排查》第四节;如果只有条码下方的可读字符缺失或比例失真,请看《条码可读字符缺失与字体比例失真排查》。下面按「现象→原因→步骤」给出可照做的处理办法。

一、先把三种「字不对」分开,否则一定反复返工
现场把三种现象混为一谈,是缺字类问题久拖不决的主要原因。判据只有一句话:看是「换了字体」「字变了」还是「字没了」。
- 整段字体变了:一段文字整体变成宋体、黑体或其他默认字体,字宽和行距跟着变,但字全都还在。这是目标环境没有装这个字体,软件自动回退。处理办法是安装原字体或改用两边都有的通用字体,详见《Brady Workstation 模板偏移与字体丢失排查》第三节。
- 字变了:中文变成别的汉字、问号或一堆看不懂的符号,字符数量没少。这是编码不匹配:数据源用 UTF-8 存,软件按 GBK 解析,或反过来。处理办法是统一两端的编码口径,详见《Codesoft 序列号不递增与数据库字段错乱排查》第四节。
- 字没了:个别字符变成空白、方框、豆腐块,或者直接被跳过,其余字符完全正常。这是本文的范围——字形在某个环节没有被送到最终的成像环节。
还有一个容易误判的邻居:打印出来模糊、缺笔画、细笔画断开,那是浓度与打印头状态的问题,肉眼常被当成「字体发虚」,实际换字体一点用没有,请走打印质量那条线。
二、缺字的四层根因:按这一格一格往下查
一个字符要从数据源走到标签上的墨点,必须经过四道关口,任何一道断了都会表现为缺字,但修法完全不同。
- 字形覆盖层:所选字体本身就不含这个字的轮廓。字体是字形集合,没有任何一款字体覆盖 Unicode 全部字符。生僻字、特殊符号最容易在这里断。
- 子集化层:导出 PDF 或生成打印指令时,为减小体积只嵌入了当前用到的字符。之后数据源里新出现的字,不在那个子集里,就打不出来。
- 字体送达层:字体装在设计电脑上,不等于送到了打印机。热敏与热转印机器内置的是点阵或笔画字库,TrueType 需要随作业下发或事先下载到机器,没送到就会被内置字体替换或直接丢弃。
- 字符集边界层:编码标准与代码页决定了「哪些字符能被表示」。GB2312、GBK、GB18030 收录的汉字数量不同,Windows 各代码页的高位区字符也不同,超出边界的字符在这一层就丢了。
现场判断的口诀是「先问字体有没有,再问有没有被裁,再问有没有送到,最后问编不编得出」。顺序不能反——字体本身不含这个字,你把编码改到 UTF-8 也没用。
三、第一步:把缺的是哪些字固定成清单,别急着换字体
缺字类问题最常见的浪费,是看到一个字打不出就换一种字体,换完发现另一个字又打不出。正确做法是先做一份缺字清单。
- 把模板里所有静态文字抄下来,包括标题、单位、备注、页脚。
- 把数据源全集扫一遍,而不是只看屏幕上那几条记录。用 Excel 打开数据源,对文字列做一次去重,导出唯一值列表。动态字段里偶尔出现一次的生僻字,往往就藏在这里。
- 逐个取字符的 Unicode 码位。Windows 自带的「字符映射表」可以查到每个字符的码位,也能直接看出某个字体里有没有这个字——切换字体后对应的格子是空的,就说明这款字体不含该字形。
- 把清单分成三组:汉字、特殊符号(商标、注册、温度、正负、乘号、度数、上标下标、箭头、全角括号)、外文与带音标字符。三组各自的修法不同。
- 把清单写进模板备注或变更记录,后面换字体、换机器、换软件都按这份清单验收。
做完清单再判断,通常能直接看出规律:如果缺的全是生僻字,问题在第一层;如果缺的全是后来新增的产品名,问题在第二层;如果同一份模板换台机器就好了,问题在第三层;如果缺的全是符号,问题在第四层。
四、第二步:查字形覆盖——这款字体到底有没有这个字
字体厂商不会覆盖全部字符。判断办法很直接:在字符映射表里选中该字体,找到那个字符,格子是空的或者显示为缺省方框,就说明字形不存在。这一层没有参数可调,只有三条路:换字体、加回退字体、把该字符做成图形。
常见缺口集中在两类。第一类是特殊符号:™、®、℃、±、×、°、μ、Ω、²、³,以及箭头、全角括号、罗马数字。很多中文字体对这批符号的覆盖不完整,尤其早期版本。第二类是生僻字,多出现在人名、地名、化学名与古籍类内容里。
汉字编码标准的收录规模是这一层的硬边界,可以直接用来判断风险:
- GB2312-80:收录 6763 个汉字(一级 3755 个按拼音排序、二级 3008 个按部首排序)加 682 个符号,覆盖日常用字,生僻字缺口最大。
- GBK(1995):扩展到 21886 个汉字与图形符号,含 GB2312 全部汉字、BIG5 全部繁体字与一部分生僻字;中文 Windows 的 ANSI 编码即 CP936,对应 GBK。
- GB18030-2005:收录 70244 个汉字与字符,采用 1、2、4 字节变长编码,含少数民族文字与 CJK 扩展区。
- GB18030-2022:收录汉字 87887 个,比上一版增加一万七千余个生僻汉字,覆盖绝大部分人名、地名、文献与专业领域用字,2023 年 8 月 1 日起实施。
也就是说,如果链路里任何一环停留在 GB2312 时代,人名与专业术语里的生僻字必然出问题。实操口径是:数据源、软件、指令层、打印机字库四处的字符集口径必须统一,且按清单里最生僻的那个字来定档,而不是按常用字定档。
这一层的处理顺序:先在现有字体家族里换一款覆盖更全的同族字体(例如从早期版本换到更新版本),再把确实覆盖不到的字符改用字体内已有的等价写法,最后才考虑做成图形。注意「做成图形」会牺牲可变数据与检索能力,只适合固定不变的标识类字符。
五、第三步:查子集化——导出或下发时字被裁掉了
全量嵌入一款中文字体会让文件体积暴涨,所以多数工具默认只嵌入当前文档实际用到的字符,这就是子集化。子集化本身不是故障,问题出在内容会变的场合:模板设计阶段只用了几百个字符,量产时数据源里冒出一个新字,子集里没有,就成了方框。
识别办法:
- 在 PDF 阅读器里打开「文件 → 属性 → 字体」,看每一款字体的状态:已嵌入、已嵌入子集,或没有标注(仅被引用)。
- 子集字体在字体名前面带一个六字母大写前缀加一个加号,形如 ABCDEF+字体名。看到这个前缀,就说明这个文件只带了当天用过的那批字形。
- 用命令行工具(如 Poppler 的 pdffonts)可以直接列出每款字体的嵌入与子集状态,适合批量核对。
处理办法三条,按对文档生命周期的影响排序:
- 内容不再变的最终稿:保留子集即可,体积小、状态稳定。
- 内容还会变的模板与母版:改为全量嵌入。需要留意,全量嵌入的前提是字体的许可允许嵌入;字体供应商在字体文件里设置了不允许嵌入的标志时,工具无法强行嵌入。
- 许可不允许嵌入时:导出环节会把文字栅格化为图像,或者替换为替代字体。栅格化能保证显示,但文字不再是文本,无法被检索与再次编辑,也不适合带可变数据的标签。
标签场景有个额外要点:批量打印走的是打印通道,不走 PDF 导出通道,两者是否子集化互不影响。很多团队改了导出设置发现打印没变化,就是找错了通道。打印通道的字形覆盖,要看下一节。

六、第四步:查 TrueType 有没有真的送到打印机
设计电脑上装了某款字体,只保证屏幕与预览正确。热敏、热转印机器自己有一套内置字库,通常是点阵或笔画字体,字符数量有限;TrueType 必须随作业下发或事先下载到机器,机器里没有就会出现替换或缺字。软件里若把「以图形方式打印文本」关掉,机器收到的是「用某字体打印某字符串」的指令,找不到该字体就会退回内置字体或干脆丢弃该字符。
驱动侧的核对步骤(以 Seagull 类驱动为例):
- 打开打印机属性,看有没有 Fonts 页签。没有这一页,说明该机型不支持下载字体,缺字只能靠随作业下发或以图形方式发送来解决。
- 有该页签时,点 Font 按钮,下拉选择 Download Font,选中需要的字体与字形。
- 若驱动同时支持可缩放与位图两种下载方式,会给出 Scalable 与 Bitmap 两个选项。选位图方式时必须指定字号与字符集,字符集选窄了,高位区的符号与汉字一样会缺。
- 字体存储位置保持默认值,除非机型手册另有要求。
- 下载完成后,这款字体对该打印机而言等同于驻留字体,可以在文本对象的字体列表里直接选用。
- 下载完成后必须打一张实物核对。下载成功不等于字形完整,位图方式尤其要按缺字清单逐个验。
还有两个驱动层开关会改变字体的发送方式,排查时要一并核对:
- 使用打印机的静态图形 / 静态标签:让驱动把每个项目都完全相同的对象(含 TrueType 字体)存进打印机,减少重复下发,也减少因下发失败导致的缺字。
- TrueType 以图形方式发送:驱动会把 TrueType 文本当作图形送到感热打印机。这条能保证字形不缺,但代价是无法使用打印机内置的序列化功能递增——需要靠机器自增的序列号对象,必须用机器内置字体,不能靠 TrueType。
七、第五步:指令层的编码与字体调用(Zebra ZPL)
走原生指令打印时,编码与字体都必须在指令里显式声明,没有默认值可用。核心是两条指令加一条编码指令。
编码指令 ^CI。它决定打印机如何解释后面字段里的字节,未指定时打印机按默认代码页处理,中文与带音标字符会出错:
- ^CI13:Windows 代码页 850,也是不指定时的默认档。
- ^CI27:Windows 代码页 1252(拉丁一)。
- ^CI14:双字节亚洲编码(DBCS)。
- ^CI26:多字节亚洲编码(MBCS),中文场景常与编码转换表 GB18030.DAT 配合使用。
- ^CI28:Unicode(UTF-8 编码),现代标签里带音标、人名与各类 Unicode 文本时的通用选择。
字体调用。先把字体文件确认清楚,再决定按文件名调用还是按标识符调用:
- 列出机器里已存的字体:向打印机发送 ^XA^WDE:*.TTF^XZ 可打印 E 盘字体清单;^XA^WDZ:*.FNT^XZ 可列出 Z 盘原生字体(扩展名为 FNT 或 TTF 的即为字体文件)。带屏显的机型也可以在菜单里走「工具 → 打印信息 → 字体」。
- 字体存入机器后文件名会被改写,但通常仍保留可辨识的字体名片段(例如 Brush Script MT 存进去后变成 BRU000.TTF 这类名字)。
- 按文件名调用:^A@N,50,70,E:字体文件名.TTF,三个数字依次是方向、字宽点数、字高点数。
- 按标识符调用:先 ^CWK,E:字体文件名.TTF 把字母 K 绑到该字体,再用 ^AKN,50,70 引用。
- 关键点:存于 E 盘的标识符绑定在打印机重启后会被自动取消。所以走标识符方式时,每个打印作业都要在前面带上 ^CW,不能只在装机时下发一次。Z 盘原生字体默认已有字母标识,不需要这一步。
中文两种可照抄的写法(以 SIMSUN 字体为例):一种是加载编码转换表后走多字节档,另一种直接走 UTF-8:
- 多字节档:^CW1,E:SIMSUN.TTF 绑定,^SEE:GB18030.DAT 加载转换表,^CI26 指定多字节编码,再用 ^A1N,20,20^FD内容^FS 输出。
- UTF-8 档:^CW1,E:SIMSUN.TTF 绑定,^CI28 指定 UTF-8,直接输出 UTF-8 字节流,不需要转换表。若机器没有预装该字体,需要先把它下载进机器。
大字体的两条硬限制。超过 256 个字符的字体(中日韩属这一类)要用 ~DU 下载,它是不受限的 TrueType 下载指令,而 ~DT 有 256 字符上限;并且 ^FB 不支持大 TrueType 字体,也就是说这类字段不能靠指令自动换行,需要在软件侧把换行位置算好。另外,使用 TrueType 或其他非打印机厂商提供的字体涉及字体授权,需由使用方自行取得在打印机中使用的许可。
八、第五步(续):指令层的编码与字库(TSC TSPL)
TSPL 侧对应的是 CODEPAGE 指令与字库下载,口径与 ZPL 不同,容易搞混。
- 手册给出的代码页表里,常用档位包括:850 多语言、852 斯拉夫、936 简体中文 GBK、950 繁体中文 Big5、932 日文 Shift-JIS、949 韩文、以及 UTF-8。
- 用 TTF 字库打印时,官方资料给出的口径是:字体文件的字符集编码是 UTF-8,对应指令为 CODEPAGE UTF-8;字库字号过小会导致打印出来看不清,指令里的字号参数要相应写大。
- 需要走 GBK 的老机型,用 CP936 一类档位替代 UTF-8,并确保主机端发出的字节编码与声明的代码页一致——只改指令不改数据,或者只改数据不改指令,都是最常见的乱码来源。
- 自定义字库通过 DOWNLOAD 指令烧录进打印机,再在输出指令里按字体文件名与字号绑定后使用。
- 没有内置中文字库、也无法下载字库的机型,只能把中文预渲染成位图,用位图类指令送进去。这条路能保证显示,但同样失去文本属性。
跨品牌迁移模板时尤其要注意:同一串中文在 ZPL 与 TSPL 下的默认编码口径不同,直接搬指令必然出问题,必须把编码声明与字库绑定一起重写。

九、特殊符号的专项处理
符号类缺字要分清两种成因,判据是变成方框还是变成别的符号。
- 变成方框或空白:字形缺失,字体里没有这个符号,属于第一层。换字体或做成图形。
- 变成另一个符号:代码页不同,同一个字节在不同代码页里指向不同字符,属于第四层。统一代码页即可,不需要换字体。
第二条在现场极常见:同一个度数符号,在 UTF-8 里是两个字节 C2 B0,在代码页 1252 里是单个字节 BA。指令里声明的编码与数据实际编码差一个,符号就换成别的字符,而字母数字部分因为低位区一致看起来完全正常,于是被误判成「字体问题」。
需要在指令里精确控制字节时,可以用十六进制字段写法:^FH 打开十六进制指示,后面每个字节写成 _XX 的形式。UTF-8 场景需要 ^CI28 与 ^FH 同时到位,并且每一个非 ASCII 字节都要逐个转义,漏一个就会整体错位。这条路的优点是能穿过不支持直接发送非 ASCII 字符的中间系统,缺点是维护成本高,只建议在确实需要时使用。
更省事的做法有三条,按推荐顺序:一是改用字体里确实存在的等价字符(例如用「度」字代替度数符号);二是把固定不变的符号做成图片对象;三是整段文字改用覆盖完整的字体。具体采用哪条,取决于该符号是否参与可变数据。
十、六步排查顺序:从样张到参数,不返工
- 留样:把出问题的标签实物留一张,标出缺的是哪几个字,同时截一张软件预览图。两者对比,能立刻区分是「设计端就没有」还是「设计端有、输出没了」。
- 出清单:按第三节的办法把静态文字与数据源全集去重,形成缺字清单,并按汉字、符号、外文分组。
- 查字形:在字符映射表里逐款候选字体核对清单,剔除不含该字形的字体,确定候选字体。
- 查通道:分清走的是打印通道还是导出通道。打印通道看驱动 Fonts 页签与字体下载状态;导出通道看 PDF 的嵌入与子集状态。
- 查指令:原生指令打印的,核 ^CI(或 CODEPAGE)声明、字体是否已在机器里、^CW 是否每个作业都带、字体文件名是否与机器里的实际文件名一致。
- 打样验收:按下一节的三张样张打样,全部通过再恢复量产。
每一步做完都要打一张实物,不要用预览代替。屏幕上字体替换的结果与实际打印结果并不总是一致,这是缺字类问题反复返工的第一大原因。
十一、三张验收样张
- 样张一 缺字清单样张:把清单里全部字符打在一张标签上,包括所有生僻字与特殊符号。这张用来验字形覆盖与字库完整性,每次换字体、换机器、升级固件后都要重打。
- 样张二 真实数据样张:用数据源里最极端的一条记录打一张,包含最长的产品名、含生僻字的字段、含符号的单位。这张用来验子集化与动态字段,避免量产才暴露。
- 样张三 最小复现样张:只放一个出问题的字符加一个条码,去掉所有其他对象。这张用来在两台机器或两个软件之间做同一性比对,快速定位是模板问题还是机器问题。
十二、预防:把字符集口径固化下来
- 建立字体白名单:规定模板只能使用白名单内的字体,白名单按缺字清单验过覆盖能力,新字体入册前必须先过一遍清单。
- 把缺字清单写进模板说明,随模板一起流转,换电脑、换机器都按它验收。
- 数据源入库时做一次字符集体检:对文字字段取唯一值,检查是否有超出既定字符集档位的字符,提前在业务系统侧处理(例如给出常用替代写法),而不是等打印时才发现。
- 统一编码口径:数据源、软件、指令层、打印机字库四处用同一档字符集,并把这一条写进交付文档。
- 机器侧做字体台账:记录每台机器里下载了哪些字体、文件名是什么、是位图还是可缩放,避免换机后对不上。
- 系统升级、固件升级、软件换版之后重打样张一,这三类变更最容易改变字体映射关系。
常见问题
1. 预览里有这个字,打出来没有,最可能是什么原因?
三处优先查:一是字体没有送到打印机,被内置字体替换后丢弃;二是导出或下发时做了子集化,这个字不在子集里;三是下发的指令里该字段被覆盖或编码档位不对。判断办法是换一台同型号机器打同一模板,两台都缺是模板或指令问题,只有一台缺是那台机器的字库或固件问题。
2. 字体在设计电脑上装得好好的,为什么打印出来是方框?
装在设计电脑上只保证屏幕与预览正确。机器内置的是点阵或笔画字库,不含该字形时就会显示为方框或空白。需要把 TrueType 下载到机器(驱动有 Fonts 页签才支持),或让软件以图形方式发送文本。改完必须打实物核对。
3. 只有生僻字打不出,常用字都正常,是哪里的问题?
是字形覆盖问题。GB2312 只收录 6763 个汉字,人名、地名、专业术语里的生僻字大量落在这个范围之外;GBK 扩到 21886 个,GB18030-2022 收录 87887 个汉字。先在字符映射表里确认候选字体是否含该字形,再把整条链路的字符集档位统一按清单里最生僻的字来定。
4. 特殊符号打不出来,是编码问题还是字体问题?
看表现:变成方框或空白是字体不含该字形,换字体或做成图形;变成另一个符号是代码页不同,例如度数符号在 UTF-8 里是 C2 B0、在代码页 1252 里是 BA,统一代码页即可,不需要换字体。
5. 导出的 PDF 在别的电脑上部分字变方框,怎么修?
先看是不是子集化:在 PDF 属性里看字体状态是否为「已嵌入子集」,字体名前带 ABCDEF+ 这类前缀的就是子集。内容还会变的模板改为全量嵌入;全量嵌入的前提是字体许可允许嵌入,许可不允许时导出环节会栅格化或替换,这时应换用可嵌入的字体。
6. 怎么知道这台打印机支不支持下载字体?
打开打印机属性,看有没有 Fonts 页签,没有这一页就说明该机型不支持下载字体。缺字只能靠软件随作业下发或以图形方式发送文本来解决,或改用字库覆盖更全的机型。具体规格以产品页为准。
7. 下载到打印机的字体,重启之后就用不了了?
存于 E 盘的字体标识符绑定会在打印机重启后被自动取消,这是设计如此。走标识符方式的,必须在每个打印作业前面带上 ^CW 重新绑定,不能只在装机时下发一次;或者直接改用按文件名调用的方式。
8. ZPL 里怎么指定 UTF-8?
在字段数据前发 ^CI28,它指示打印机按 UTF-8 解释后续字段的字节。未指定时打印机按默认代码页处理。若还要在指令里写十六进制字节,需同时加 ^FH,并把每个非 ASCII 字节逐个写成 _XX 形式。
9. TSPL 打印中文要用什么代码页?
用 TTF 字库时按官方口径设为 CODEPAGE UTF-8,并确保发出的字节确实是 UTF-8;老机型可改用 936(简体中文 GBK)一类档位,同样要求数据与声明一致。字库需先用 DOWNLOAD 指令烧录进机器,并按字体文件名与字号绑定后使用。字号参数过小会导致打印出来看不清,需要相应调大。
10. 换了一台同型号机器,同一模板一台能打一台不能打,为什么?
同型号不等于同配置。核对三项:机器里有没有下载过该字体、固件版本是否一致(字体映射与编码支持会随固件变化)、以及驱动里的字体下载与图形方式开关是否一致。用最小复现样张在两台机器上各打一张即可定位。
11. 把文字做成图片是不是就能解决缺字?
能解决字形缺失,但有代价:文字不再是文本,无法被检索与再次编辑,也不能参与可变数据与序列化递增。只建议用于固定不变的标识类字符;参与变量、需要计数或需要被扫码系统解析的内容,必须保留为文本对象。
12. 字体能不能随便下载到打印机里用?
TrueType 或其他非打印机厂商提供的字体涉及字体授权,需由使用方自行取得在打印机中使用的许可。若字体文件里设置了不允许嵌入或不允许分发的标志,下载与嵌入都会失败或被栅格化处理,此时应联系字体供应商取得可嵌入版本,或改用授权允许的字体。
13. 怎么在量产前就发现会缺字?
做两件事:一是对数据源文字字段取唯一值做字符集体检,找出超出既定档位的字符;二是按缺字清单与最极端的一条真实记录各打一张验收样张。改字体、换机器、系统升级、固件升级之后都要重打样张。
相关支持文章
- 《Brady Workstation 模板偏移与字体丢失排查》——整段字体被替换、换电脑后版式错乱
- 《Codesoft 序列号不递增与数据库字段错乱排查》——数据源编码与中文乱码
- 《条码可读字符缺失与字体比例失真排查》——条码下方可读字符的参数与单位
- 《操作系统升级后标签软件与驱动失效排查》——升级后字体映射关系变化
- 《固件升级后模板错位与指令不兼容排查》——固件变更引发的字体与指令问题
- 《标签图片与logo打印失真与抖动设置排查》——图形对象的分辨率与抖动
如需按机型核对标签打印方案、标签材料与碳带匹配,可查看标签打印方案与产品中心;遇到本文未覆盖的现象,可联系技术支持并提供样张照片、模板文件与实际下发的指令文本。


