简介:面向AutoCAD用户的DWG图纸字体合集,包含大量常用SHX形字体文件,主要解决打开他人图纸时因缺字体而出现的问号、乱码、替身字体等问题,适合建筑设计、机械制图、工程施工等频繁交换DWG文件的场景。压缩包内共含357个文件,其中351个为shx字体文件,覆盖中文形字体、大字体与西文字体,另有2个rsc资源、1个xml配置、1个pfb字体、1个txt说明和1个sys系统文件,整体约80.8MB,便于下载后直接放入CAD字体目录使用。已有4822人学习下载。这套字体包对于经常处理历史图纸和异地协作图纸的设计人员尤其实用,可减少逐个查找缺失字体的时间,快速恢复图纸文字的原生显示效果;同时附带少量配置与说明材料,有助于理解字体加载和替换的逻辑,是解决CAD字体丢失问题的一站式资源。无论自用还是与同事交换图纸,都能缓解字体缺失带来的阅读与出图障碍。
1. 打开 DWG 满屏“口口口”或“???”:八成是 SHX 字体没配对,先搞清它是什么
做 CAD 的人几乎没有不跟 SHX 字体打过交道的,但真正把它讲明白的人不多。接手一份外来 DWG,第一眼看到的是文字全部变成“???”,或是一堆乱码般的特殊符号,又或者字体显示成“口口口”的方块——这个场景在建筑施工图、机械图纸、规划地形图里反复出现,尤其从设计院传到施工方、从老工程师传到新同事,几乎每传一次就要翻一次车。SHX 字体,简单说就是 AutoCAD 的形字体(Shape File)编译产物,它不是 TrueType 那种系统字体,而是 AutoCAD 自己的一套矢量字体体系,专门用来保证图纸在不同设备上按同一套几何规则显示。这套字体对 DWG 来说意味着三件事:文字样式能不能对上、多字节中文能不能显示、图纸打印出来字形会不会错位。它解决的痛点非常具体——DWG 文件本身不内嵌字体,换台机器缺了对应 SHX 就用不了。这篇文章适合所有被外来 DWG 字体问题折磨过的人:设计师、绘图员、BIM 翻图工程师、CAD 二次开发人员,读完能自己动手把字体配对、替换、兜底全搞定。
2. SHX 字体机制:为什么 DWG 离了它就变天书
2.1 形文件机制:SHX 不是字体,是“画字”的指令集
SHX 全称是 Shape File,直译是形文件,它的本质不是描述每个字符外轮廓的曲线数据,而是用 AutoCAD 自带的形定义语言写出来的、经过编译的二进制指令集。形定义的基本单位是“形”,每个形由一个编号、一个字节数、若干描述性字节组成,描述字节告诉 CAD“从当前点向哪个方向走多少、要不要抬笔、要不要落笔”,类似一个微型矢量绘图程序。普通文字类的 SHX 文件里,这些形对应的是 ASCII 码或扩展编码,CAD 在渲染时逐条解释这些指令,在屏幕上画出对应的笔画。
这就带来一个核心差异:TrueType 字体是靠操作系统字体渲染引擎读取字形轮廓数据来显示,而 SHX 字体是 CAD 内部自己解析、自己绘制的,不受系统已安装字体影响,所以它非常稳定、非常轻量,CAD 打开图纸时只要能在字体搜索路径里找到同名文件,就会按同一个速度渲染。但反过来,一旦找不到,CAD 不会给你任何提示,而是默默用代理字体替代,于是满屏问号和方块。
我做图纸翻图时最头疼的也是这里:SHX 文件一旦缺失,它不像 TrueType 那样能在系统字体列表里找到替代品,你必须找到同名或同型文件,否则文字永远显示不对。而且 SHX 编译后是二进制的,普通文本编辑器打开只会看到乱码,你没法像改 TTF 那样直接改字形。
2.2 大字体(Big Font)与多字节语言:中文到底走哪条路
AutoCAD 最早是给单字节拉丁字符设计的,ASCII 只有 128 个字符,英文、数字、符号够用,但亚洲语言动辄几千个字符,单字节编码根本不够放。于是 AutoCAD 引入了一个机制叫“大字体”(Big Font),专门处理像中文、日文、韩文这类多字节字符集。
这里要理解一个关键点:在 AutoCAD 文字样式(Text Style)对话框里,字体名可以选择两类字体——一类是普通 SHX(比如 txt.shx、simplex.shx),负责单字节字符;另一类是“大字体”选项,比如 hztxt.shx、gbcbig.shx,负责双字节字符。当你在样式里勾选“使用大字体”并把大字体指向一个中文字体 SHX 时,AutoCAD 把 ASCII 字符交给普通 SHX 渲染,把非 ASCII 字符交给大字体 SHX 渲染。两条通道各管一段,配合起来才是一个完整的字体。
中文图纸里最常见的做法是:样式字体设为 gbcbig.shx,或者用 hzfs.shx、hztxt.shx 这类带中文的字体同时兼顾英文字符。gbcbig.shx 是 AutoCAD 国标版的国标大字字体,对应 GB2312 编码范围,机械、建筑国标图用得非常多。而 hztxt.shx 这类字体则是民间高频流传的,笔画接近仿宋,很多人用它替代默认的 TXT 字体,让图纸更接近国标手写风格。
这里有一个特别容易踩的误区,经常有人把“使用大字体”理解为“只能用大字体”,实际不是。大字体选项只是指定了多字节字符映射表,单字节字符仍由主字体决定。如果主字体的英文字形不好看,换一个好看的 SHX 就能把中西文视觉效果都拉上来。
2.3 常用 SHX 字体清单与选型:怎么选才不出乱子
不同行业、不同年代、不同版本的 CAD 工程图,用的 SHX 字体路径分支差异很大。我经手过的图纸里,出现频率最高的几个可以列出来供你对照:
| 字体文件 | 类型 | 常见用途 | 备注 |
|---|---|---|---|
| txt.shx | 普通 SHX | 默认字体,纯单字节 | 几乎所有 CAD 都有 |
| simplex.shx | 普通 SHX | 单线体,英文字母数字 | 线条简洁,老图纸常见 |
| gbcbig.shx | 大字体 | 国标中文长仿宋 | 国标图首选中文大字体 |
| hztxt.shx | 大字体 | 中文仿宋风格 | 流传极广,但部分版本有编码问题 |
| hzfs.shx | 大字体 | 中文仿宋 | 建筑图高频使用 |
| bigfont.shx | 大字体 | 通用中文大字体 | 老版本 CAD 常用占位符 |
选型时我的习惯是:先看图纸文字的“性格”——机械图对符号精度要求高,尽量用 gbcbig.shx 保证范围覆盖;建筑图对中文笔画风格有一点审美预期,hztxt.shx 或 hzfs.shx 更贴近制图标准;如果是自己新建样式,优先用 gbcbig.shx,因为它被国标版 CAD 原生支持,字体范围覆盖完整,乱码概率最低。
另外特别提醒,市面上的 SHX 文件版本很杂,同名文件可能来自不同编译批次,有的支持 GB2312 全集,有的只覆盖常用汉字,用错了就出现“中间不显示、两头显示”的诡异现象。遇到这种情况,我会把同名字体从多个来源做字节对比(md5 校验),选最接近国标版的那一个,这个习惯帮我排除过很多“玄学”问题。
3. 把 SHX 字体装进 CAD:手动放置、路径设置与批量替换
3.1 字体文件放置位置:Fonts 目录与搜索路径的优先级
拿到一个 SHX 字体文件后,第一步不是打开 CAD 去选它,而是把文件放到 AutoCAD 能搜到的位置。AutoCAD 的字体搜索路径有默认的一套顺序:首先是当前 DWG 文件所在目录,其次是 CAD 安装目录下的 Fonts 文件夹,然后是支持文件搜索路径里配置的附加目录。
我一般建议把常用的 SHX 统一扔到安装目录的 Fonts 里,比如 Windows 下典型路径是C:\Program Files\Autodesk\AutoCAD 2024\Fonts,这样做的好处是所有图纸打开时都能在同一位置命中,不用每个项目单独带字体。但要注意一点,有些企业会把 CAD 装在非默认盘符,或者用中望 CAD 这类国产平台,路径会不同。在不确定的情况下,用 CAD 命令OP打开选项对话框,切到“文件”选项卡,展开“支持文件搜索路径”,里面能看到当前生效的字体目录列表。
# 以管理员身份执行,把当前目录下的所有 SHX 复制到 AutoCAD Fonts 目录 # 请先确认你的 CAD 安装路径,下面以 2024 版默认路径为例 cp -rf ./*.shx "/c/Program Files/Autodesk/AutoCAD 2024/Fonts/" ls "/c/Program Files/Autodesk/AutoCAD 2024/Fonts/" | grep -i shx | head -20这里用了cp -rf强制递归复制,加上-f参数可以覆盖同名的旧文件。实际执行时要注意:如果 CAD 正在运行,Windows 会提示文件被占用,需要先关闭 CAD 再复制,否则文件写入失败。覆盖同名文件前建议先备份原文件,因为不同版本的 AutoCAD 对同名字体的兼容性不一样,覆盖后可能导致别的高版本图纸出现异常。
提示:不要为了省事把所有 SHX 都堆到 DWG 同目录下,那样每个项目都要重新配一遍,而且图纸分发时容易被遗漏。放 Fonts 目录是长期最优解。
3.2 用 STYLE 命令核对文字样式:别让字体“名存实亡”
字体文件放到位了,接下来要把图纸里的文字样式重新指认一遍。打开 DWG 后,在命令行输入STYLE回车,会弹出文字样式管理器。这里能看到当前图纸里所有已定义的文字样式,每个样式都有字体名、大字体、高度、宽高比等参数。外来图纸最常出现的问题就是:样式名还在,但字体名指向的是一个不存在的 SHX,CAD 在打开时静默降级,根本不告诉你。
我会按这个顺序排查:先看样式列表里有没有带黄色感叹号的条目,有的话直接双击进去重新选字体;再看有没有指向txt.shx但图纸原意是中文仿宋的样式——这种情况图面会显示为英文正常、中文乱码,与缺字体不是一回事,属于样式定义本身就是错的;最后看大字体字段,很多图纸只指定了主 SHX,大字体留空,中文就全变成“???”。
排查步骤在命令行里做效率更高:
Command: STYLE -> 打开样式管理器后,逐个选中样式 -> 观察“字体名”下的 SHX 路径是否真实存在 -> 观察“大字体”是否已指定 -> 对异常样式,重新选择可用字体并应用这里强调一下:STYLE命令改的是当前图纸内的样式定义,不写回外部 DWG 外的其他文件;对批量处理的图纸,你需要一张一张处理或者用脚本批量操作,手动一张张点效率很低,下一节讲批量方案。还有一个小技巧,如果图纸里的文字样式非常多,可以在样式管理器里按字体名列排序,所有指向同一个缺失字体的样式会排在一起,一次就能看清问题的规模。
3.3 替换字体的三种方法:样式覆盖、格式刷与脚本批处理
手动改样式适合一张两张图,图多了必须用自动化手段。先说三种常用方法,再给出真正适合批量生产的脚本。
方法一是直接在样式管理器里把缺的字体名替换成已有字体,适用于样式数量少、结构清楚的图纸。方法二是用格式刷(MATCHPROP)把一个正确样式刷到别的文字对象上,但有前提:被刷的文字对象和源文字对象用的是同一个文字样式,如果样式本身是坏的,格式刷刷过去只是把坏样式传播开,没用。方法三是写 AutoLISP 脚本或小插件,遍历所有文字样式,把指定的缺失字体映射成可用字体,这是我最常用的方案。
;; 批量把样式里的缺失字体替换为 gbcbig.shx ;; 用法:在 AutoCAD 命令行用 APPLOAD 加载,或直接把代码粘到 VLIDE 执行 (defun c:fixSHX () (setq ss (ssget "_X" '((0 . "TEXT,MTEXT")))) ; 选择所有单行和多行文字 (if ss (progn (command "_.style" "Standard" "gbcbig.shx" "gbcbig.shx" 0 1 0 "" "") ;; 上面这一步把 Standard 样式重建为 gbcbig.shx + 大字体 (princ "\n已重建 Standard 样式,请手动选择需要更新的文字对象") ) (princ "\n未找到文字对象") ) (princ) )代码逻辑是:先筛选出所有文字对象,再用command直接重建名为 Standard 的文字样式,字体设为 gbcbig.shx 并同时作为大字体,替代原来失效的字体配置。执行后文字样式定义本身已恢复,但已有文字对象需要触发一次重生成才能更新显示,在命令行输入REGEN或直接缩放一下视图即可。
参数说明:0是固定高度,表示不锁定字高,沿用对象自带高度;1是宽高比,保持原样不清洗;最后一个空字符串表示不指定倾斜角度。这套参数对大多数图纸安全,但对某些特殊标注样式,建议逐个确认宽高比再动手。
4. 避坑:SHX 字体常见的五个翻车现场
4.1 现象:打开图纸全是“???”,换成别的字体也没用
原因:最常见的不是缺字体文件本身,而是缺大字体文件。很多图纸的样式把大字体指向 hztxt.shx,但你的 CAD 里只有 txt.shx,主字体找到了,大字体没找到,于是中文全部无法映射,显示为问号。更隐蔽的一种是,大字体文件里字符映射表并未覆盖图纸使用的编码范围,典型的如某些精简版 hztxt.shx 只覆盖 GB2312 常用字,碰到生僻字就显示为“?”,这时你换文件名是无效的,必须换字符集更完整的版本。
解决:先查样式管理器,看大字体字段是否为空;再查大字体文件是否真实存在于 Fonts 目录;最后对比文件大小。正常情况下 gbcbig.shx 大约 1MB 以上,hztxt.shx 也在几百 KB,如果文件只有几十 KB 那大概率是精简版,直接换成完整版即可。从那以后我每次处理“???”问题都按照这个顺序排查,先看大字体再看主字体,几乎不会再绕弯。
4.2 现象:字体能显示但文字错位,标注挤成一团或拉得特别开
原因:SHX 字体的字形宽度是编译期写死的,每个字符占据的宽度来自字体文件内部的形定义,不受操作系统字体管理器影响。当两张图纸引用的是同名但不同版本的 SHX 时,字符宽度不同,导致同样字符串在两张图里占的宽度不一样,文字对不齐,标注线延伸位置出错。另一种原因是文字样式里的宽高比因子被改过,比如从 0.8 改成 1.2,文字被横向拉长或压缩,视觉上就是错位。
解决:统一字体文件版本。把项目组里流通的 SHX 文件做一次 MD5 校验,确保团队所有人用的是同一个文件;修改临时错位的文字时,选中后用PROPERTIES面板把“宽度因子”改回 1.0 或图纸原设定值。这个坑在协同设计场景里几乎是“每日一坑”,不统一版本永远在追错位。
4.3 现象:字体缺失时用 FONTALT 指定的替代字体不生效
原因:FONTALT系统变量指定的是“主字体”的替代字体,不是大字体的替代。AutoCAD 在打开图纸时,如果遇到缺失字体,会先尝试用 FONTALT 替换普通 SHX;但如果缺失的是大字体,FONTALT 根本不参与,中文仍然变成问号。很多人把 FONTALT 设成宋体之类的 TTF,发现中文还是乱码,原因就在这里。
解决:把 FONTALT 设置成完整可用的 SHX 字体,比如 gbcbig.shx,同时确认该字体文件在搜索路径中。在命令行操作:
Command: FONTALT Enter new value for FONTALT, or . for none <"simplex.shx">: gbcbig.shx设置为 gbcbig.shx 后再重新打开图纸,缺失中文大字体时能自动落到这个文件上。这个方法能解决大部分“打开图全是问号”的燃眉之急,但只是兜底,真正的修复还是要在样式管理器里把字体名改对。另外要注意,FONTALT 对 TrueType 字体无效,它只能指向 SHX 文件。
4.4 现象:别人机器上正常,自己机器上显示成另一种字体
原因:CAD 打开图纸时,文字样式记录的字体名会先去本机搜索路径里找同名文件,找到就加载,找不到才走 FONTALT 兜底。由于每个人安装的 CAD 版本、字体包、绿化补丁不同,同一个字体名在不同机器上命中的实际文件可能完全是两个东西。这就是为什么同样一张 DWG,在 A 机器上是仿宋风格,在 B 机器上变成了黑体风格,图面信息没变,但版式全乱了。
解决:把项目涉及的所有 SHX 文件连同 DWG 一起打包发到工作群,并统一放到 Fonts 目录。对于中型团队,最可靠的做法是做一个字体分发包,内含项目用到的全部字体文件和一个自动安装脚本,新人入组先跑一遍。脚本逻辑很简单:检查 Fonts 目录是否存在,不存在就创建;再逐一把字体文件复制进去;最后用FONTALT设置兜底字体。这套做法适用中望 CAD、浩辰 CAD 等国产平台,原理一样。
4.5 现象:CAD 里显示正常,打印出来文字变成空心或方块
原因:SHX 文字在打印时走的是 CAD 的硬件填充逻辑,如果你的打印样式表把文字对象设置成“使用对象线宽”且线宽过细,笔画极细的文字在低分辨率打印时会出现“断笔”现象,看起来像空心。另一种情况是,图片里嵌入了代理字体(Proxy Font),CAD 显示时有自己的替代渲染,但打印驱动不认识代理字体的矢量数据,于是输出成方块。
解决:检查打印样式表,把文字对象的线宽设为一个固定值,一般 0.3mm 起步;在打印对话框勾选“隐藏图纸空间对象”和“显示打印样式”。代理字体的问题比较难缠,最彻底的方案是框选所有文字对象,用TXTEXP或 Autodesk 的 Express Tools 里的“分解文字”把 SHX 文字炸成线条再打印,牺牲可编辑性换取输出稳定性。我个人的经验是:只要一张图需要长期打印出图,我就会在打印前专门跑一遍字体替换和打印测试,不等到打出来才发现问题。
5. 进阶:自建 SHX 字体映射表与批量修复工作流
5.1 用 FONTMAP 做全局字体映射:让缺失字体定向落到你指定的替代
AutoCAD 提供了一个系统变量叫FONTMAP,它指向一个文本文件,默认是acad.fmp,里面每行记录一条映射关系:缺失字体名;替代字体名。当打开图纸时,CAD 遇到缺失字体,会先查 FONTMAP,如果命中映射规则,就直接用替代字体渲染,绕开 FONTALT 的猜测逻辑。这个机制比 FONTALT 更可控,因为你可以在文件里写多条映射规则,把整个项目里所有缺的字体都一次性指认掉。
编辑 acad.fmp 的流程很简单:用记事本打开,在底部追加规则,保存后重启 CAD。语法示例:
hztxt.shx;gbcbig.shx hzfs.shx;gbcbig.shx bigfont.shx;gbcbig.shx tssdeng.shx;gbcbig.shx这个文件不仅对纯 SHX 缺失管用,也可以把 SHX 映射到 TTF。但我的建议是优先映射到 SHX,因为 TTF 和 SHX 的字形宽度、基线高度差异很大,映射到 TTF 后文字间距会和原图差很多。实际使用中,我把从图纸整理出来的所有缺失字体名都写进这个文件,然后重新打开图,图面文字基本都能对齐。这个做法对处理几十张历史图纸特别高效,不需要一张张改样式定义。
5.2 用 Python 批量扫描 DWG 缺失字体:不打开图纸也能定位
处理大批量图纸时,一张张打开看效率太低。AutoCAD 没有命令行直接列出所有缺失字体的命令,但可以用 Python 读取 DWG 的文字样式表结构。常见的做法是用ezdxf库读取 R12 或更高版本的 DXF 格式——如果拿到的不是 DWG 而是 DXF,这个方案可以直接跑;如果是 DWG,需要先用dxf转换器或者 CAD 内置的SAVEAS转成 DXF 再扫描。
import ezdxf def scan_missing_shx(dxf_path): doc = ezdxf.readfile(dxf_path) msp = doc.modelspace() # 遍历所有文字样式定义 styles = doc.styles missing = [] for style_name, style in styles.items(): font = style.dxf.font # 主字体文件名 bigfont = style.dxf.get('bigfont', None) # 大字体 if font and font.lower().endswith('.shx'): # 这里假设字体目录为本目录的 fonts/ 子目录 import os if not os.path.exists(os.path.join('fonts', font)): missing.append((style_name, font)) if bigfont and bigfont.lower().endswith('.shx'): import os if not os.path.exists(os.path.join('fonts', bigfont)): missing.append((style_name, bigfont)) return missing if __name__ == "__main__": for style, f in scan_missing_shx("drawing.dxf"): print(f"样式 {style} 缺失字体: {f}")这段代码思路是:遍历 DXF 里所有文字样式定义,提取主字体和大字体字段,再判断文件是否存在于本地fonts/目录。参数上要注意:style.dxf.font返回的是样式定义里记录的字体文件名,不含路径;用os.path.exists做存在性判断时需要把fonts/目录补上。运行前提是已经用 CAD 把 DWG 转成了 DXF,直接喂 DWG 给 ezdxf 是读不了的。
这个脚本用来做“体检”非常顺手,可以在正式打开图纸前就知道问题规模,写进批处理流程里比人工点开快得多。但它的局限也很明确:只能检测字体文件名是否存在,无法检测同名文件内容是否正确。字体文件存在但字符集不对的情况,还是要靠 CAD 里实际打开看效果。
5.3 跨平台与国产 CAD 的字体注意:中望、浩辰、麒麟系统
近两年国产化替代越来越普遍,中望 CAD、浩辰 CAD 以及统信 UOS、麒麟系统上的 CAD 版本越来越多。这些平台大多支持加载原版 AutoCAD 的 SHX 字体,但有几个细节需要单独处理:一是字体搜索路径的默认值不同,中望 CAD 默认在安装目录的Fonts子目录,麒麟系统下的路径可能带~/.local/share前缀;二是部分国产平台对某些老版本 SHX 的兼容性较差,会出现“能加载但显示错乱”的情况,这时优先尝试用国标版 gbcbig.shx 替代。
实操中我的做法是:把项目字体分发包做成一个独立目录,不依赖 CAD 安装目录,然后通过平台的“选项-文件-支持文件搜索路径”手动把这个目录加进去。这样无论是 AutoCAD 还是中望、浩辰,都能用同一套字体文件,避免在不同平台下反复复制文件。麒麟系统上如果遇到字体显示异常,还要检查系统的字体服务是否拦截了 SHX 的矢量渲染——有时候不是 CAD 问题,而是操作系统层面把字体文件当成了普通资源处理。
最后说一个我的血泪教训:以前处理外来图纸时,总觉得“能打开就行”,结果有一次图面上所有标注挤成一团,最后发现是用了两个不同版本的 hztxt.shx 混在同一个项目里,一个字符宽度写的是 20,另一个写的是 22,字距全部错开,整个标注系统全面翻车。从那以后,我每次批量处理图纸前都强制走一遍流程:先做 DXF 扫描列出缺失清单,再统一字体分发包并写 FONTMAP 映射,最后重新打开图纸抽查三个不同区域确认图面。走完这三步,字体问题基本在源头被堵死。希望帮到你。
本文还有配套的精品资源,点击获取