简介:面向CAD用户的SHX字体专用合集,集中解决图纸打开时提示缺少字体、文字显示为问号或乱码的常见问题,适用于建筑、机械、测绘、电力等行业的图纸文字标注与批量字体补齐。资源共360个文件,以351个shx字体文件为主,辅以font.rsc、internat.rsc等字符映射与本地化资源文件,另含说明文档及辅助格式文件,压缩包整体83.01MB。字体覆盖仿宋、黑体、楷体等常用中文字体,多种手写风格与扩展字形,以及工程制图必备的标注符号类字体,可满足不同专业图纸的标注需求;所有文件均为标准SHX格式,复制到字体目录后通过文字样式即可调用,并兼容AutoCAD 2007至2024多个版本。目前已有2394人学习下载,适合需要系统整理CAD字体库、保障图纸跨设备正常显示的制图人员与图档管理者,可有效避免图纸出现缺字体提示、乱码和显示错乱等问题。
1. 图纸里全是问号和方块?这套 SHX 字体合集就是为了治这个老毛病
SHX 字体在 CAD 圈子里一直是个「看不见又甩不掉」的东西。你打开别人发来的图纸,满屏问号、空心方块,标注尺寸数字变成乱码,八成就是缺了某个 SHX 字体文件。这套合集把中文简体、繁体、工程符号整理到了一起,解决的不只是「能显示」,还有「别人打开不报错」的兼容性问题。适合谁?每天跟图纸打交道、收图发图的人,以及被字体问题卡过一两次的设计师。你不需要理解形文件内部怎么存线条,只需要知道:装上这套字体,按文中配置走一遍,再打开图纸就是干净的中文和符号。
2. SHX 和 TTF 到底差在哪:为什么 CAD 图纸放弃系统字体
2.1 形文件字体:CAD 原生字体格式的工作方式
SHX 是 shape 文件的扩展名,它存的不是字符的轮廓曲线,而是形定义:每个字符由一组绘制指令组成,比如「画一条从 A 到 B 的线」「以 C 为圆心画半径 3 的圆弧」。CAD 显示文字时按指令逐笔生成,再根据文字高度做缩放。这种工作方式有两个直接结果:一是显示速度快,尤其是大批量文字重生成时,比轮廓字体轻很多;二是字形由线段和圆弧构成,打印出来笔划干净,不依赖操作系统的字库渲染引擎。
传统 SHX 是单字节编码,一个文件最多只能映射 256 个字符编号。中文常用字几千个,单字节根本放不下,所以后来引入了大字体(Bigfont)机制。普通 SHX 负责西文字母、数字、常用符号,大字体专门承载中文。CAD 的文字样式里,这两个文件配成一对,一个管「英文环境」,一个管「中文补充」。这套合集里的简体、繁体字体基本都是按这个配对方式组织的。
因此,装 SHX 字体不是把文件丢进 Fonts 目录就完事,还要让文字样式正确引用一对字体。很多人只选了 hztxt.shx 但没勾「使用大字体」,结果中文照样问号。理解形文件机制后,这类问题一看就明白:缺的不是字体文件,而是样式配置里少了 bigfont 那个字段。
2.2 SHX 与系统 TTF 的六个关键差异
| 对比项 | SHX 形字体 | TTF 轮廓字体 |
|---|---|---|
| 文件本质 | 绘制指令序列 | 曲线轮廓描述 |
| 中文支持 | 需通过大字体扩展 | 系统字体原生支持 |
| 显示速度 | 快,适合重生成频繁的图纸 | 中等,大图纸可能卡顿 |
| 字体一致性 | 固定于 CAD 环境 | 依赖操作系统安装情况 |
| 笔划表现 | 细线清晰,适合工程图 | 笔划粗细多变,打印可能发闷 |
| 传递要求 | 复制文件即可用 | 需要在目标机器装字体 |
这六个差异决定了工程图纸的选型方向。图纸天天跨电脑、跨公司传,如果依赖系统 TTF,接收方系统没有对应字体,CAD 自动用其他字体替代,版面尺寸、线宽就会变。SHX 则跟着 CAD 环境走,只要 Fonts 目录里有这个文件,任何机器打开都是同一套字形。
2.3 什么场景必须用 SHX
很多设计单位的内部制图标准里,写明图纸文字样式必须用「hztxt + gbcbig」这类组合,不允许用宋体、黑体。这不是守旧,而是为了出图一致性。图纸要反复改、反复打印,用 TTF 时同一个「Φ」符号在不同字库里的宽度可能差半个字位,导致标注重叠。SHX 的形文件是定长指令,字母宽度相对固定,排出来整齐。
另一个非用 SHX 不可的场景是做 CAD 二次开发。脚本里要创建文字,如果依赖系统字体,别人机器上没有就崩;用 SHX 配合大字体,脚本只在 CAD 环境内取字体文件,不碰系统。我做插件时,默认固定使用 hztxt.shx 加 gbcbig.shx,极少出现缺失报警。
当然,SHX 也有自己的脾气:不同 CAD 版本对某几个自定义 SHX 的编码解析可能不同,同一个字体文件在不同电脑上显示效果有细微差别。所以才需要一套整理过的合集,把常用、可用的版本统一起来,避免从网上随便下了一个带病毒的破字体。
3. 安装与配置:把字体变成默认样式的三个落地步骤
3.1 字体文件放哪里:Fonts 目录与搜索路径
主流 CAD 软件安装目录下都有一个 Fonts 文件夹,它是最优先的字体搜索位置。把 SHX 文件复制进去,重启 CAD,新的字体名就会出现在文字样式下拉框里。这个操作简单,但有个坑:有些 CAD 安装路径带空格,而且可能被用户权限保护,复制时容易遇到「拒绝访问」。
我一般会先把字体整理到一个本地文件夹,比如 D:\SHX_Fonts,然后用选项对话框里的「支持文件搜索路径」把该目录加进去。这样字体不用全塞进安装目录,文件管理更清楚。复制操作用命令行最直接:
# 将整理好的所有 SHX 复制到当前用户的 CAD 字体目录(常见路径) copy /Y "D:\SHX_Fonts\*.shx" "%USERPROFILE%\AppData\Roaming\某CAD品牌\Shared\Support\Fonts" # 如果目标目录存在空格,用引号整体包裹,避免路径断掉这里说明一下参数:/Y是覆盖同名文件不询问;源路径用引号包住是因为文件夹名里没有空格,但建议养成习惯。复制完成后不要马上用,先确认目标目录里出现了文件再启动 CAD。如果不想走命令行,直接打开两个资源管理器窗口拖拽也行,但拖拽不会覆盖目录里已有的同名文件,CAD 可能还是加载旧版本。要覆盖就要先删掉旧的,或者用命令行/Y参数。
3.2 新建文字样式:关联 SHX 与大字体
字体文件就位后,第二步是告诉 CAD「用什么组合」。命令行输入STYLE打开文字样式管理器,新建一个样式,名字自定义,比如HZ-STD。关键是下面的设置:字体名为gbcbig.shx或hztxt.shx,同时勾选「使用大字体」,再把下方出现的大字体选为另一个中文 SHX。这样西文和中文各管各的,不会互相占字符位。
高度字段设置成 0 是最稳妥的做法,让文字高度在标注样式或对象属性里单独控制。宽度因子设 0.7,这是工程制图的常用比例,中文横向压缩一点,看起来更像印刷体。倾斜角默认 0 即可,如果图纸有斜体要求可以填 15 到 22。
写脚本的人更关心重复操作。用 AutoLISP 可以批量创建一组常用样式:
;; 创建标准文字样式:西文 txt.shx + 中文大字体 hztxt.shx (defun c:MAKEHZSTYLE () (setvar "CMDECHO" 0) (command "_STYLE" "HZ-STD" "txt.shx,hztxt.shx" "" 0 0.7 15 "n" "n") (princ "\nHZ-STD 样式创建完毕") )这段代码里_STYLE后的参数依次是:样式名、字体名对、字高、宽高比、倾斜角、「反向」「颠倒」选项。""表示高度采用 0,即不固定高度。注意字体名里用逗号把普通 SHX 和大字体连在一起,CAD 内部会自动识别哪个是 bigfont。这个脚本适合放在启动组里,每次开图自动检查并创建样式。
3.3 替换图纸字体:批量操作与样式继承
打开一张旧图,文字显示为问号,根本原因往往不是字体文件不存在,而是图纸里文字样式引用了某个不存在的 SHX。解决方法有两种:一种是在文字样式对话框里把字体名改掉,另一种是写脚本批量刷样式。
用 AutoLISP 遍历文档里的所有样式并替换,省得一个个点:
;; 遍历样式表,将所有包含错误字体名的样式改为正确配对 (defun c:FIXFONT () (vlax-for sty (vla-get-textstyles (vla-get-activedocument (vlax-get-acad-object))) (if (and (wcmatch (strcase (vla-get-fontfile sty)) "*OLD*") (not (wcmatch (strcase (vla-get-fontfile sty)) "*HZTXT*"))) (progn (vla-setfontfile sty "txt.shx") (vla-setbigfontfile sty "hztxt.shx") (princ "\n已替换一个样式"))) (princ) )这段代码的精髓在于:vla-get-fontfile拿到的是普通字体,vla-setbigfontfile设置大字体。很多人在脚本里只改普通字体,忘记大字体,结果中文仍然缺失。替换时最好先备份原图,因为这个操作会改写 DWG 文件,不可直接撤销。
如果手头图纸是 DXF 格式,也可以用 Python 的 ezdxf 库做不经 UI 的批量替换:
import ezdxf doc = ezdxf.readfile("drawing.dxf") for style in doc.styles: # 只处理字体名包含 old_txt 的样式,避免误伤 if "old_txt" in style.dxf.font.lower(): style.dxf.bigfont = "hztxt.shx" # 普通字体保留为 txt.shx,防止符号丢失 style.dxf.font = "txt.shx" doc.saveas("drawing_fixed.dxf")这个脚本里,style.dxf.font是普通字体,style.dxf.bigfont是大字体。注意顺序不能反,否则 CAD 可能把 bigfont 当普通字体加载。运行前建议用doc.styles打印出现有样式列表,确认名称没有拼错。
4. 字体映射文件:CAD 自动找替代字体的黑匣子
4.1 acad.fmp 的工作原理
就算你安装了字体合集,打开老图纸时 CAD 仍可能弹窗提示「找不到 hztxt.shx」。这是因为图纸里记录的样式字体名和你本地字体文件名不一致。这时 CAD 不会直接报错,而是去读一个叫 acad.fmp 的文件,查有没有对应的替代规则。这个文件是纯文本,每行一条映射,格式是「左边缺的字体;右边替代字体」。
FMP 是 CAD 的字体兜底机制,相当于给缺失字体指定的临时形象代班。很多人没见过这个文件,但它一直在后台工作。每次打开图,CAD 都会按缺字体的先后顺序查映射,匹配到一条就停止。所以映射文件里如果写了错误的替代,缺字体时会被静默替换,表面上不报错,实际字体已经偷梁换柱。
路径一般在 CAD 安装目录的根目录,或者用户配置目录里的 Support 文件夹。打开看,里面已经预置了很多映射,比如把某些老式字体映射到 txt.shx。你要做的是把自定义 SHX 的映射补充进去。
4.2 配置映射的两种方式
第一种是直接编辑 acad.fmp 文件,用文本编辑器打开,在最后追加一行:
hztxt_old.shx;hztxt.shx gbcbig_old.shx;gbcbig.shx左侧是图纸里可能出现的缺失字体名,右侧是你希望实际使用的字体文件名。注意右侧必须是在 Fonts 目录或支持路径里真实存在的 SHX,否则映射无效,而且 CAD 还会再去查一次映射,形成死循环。
第二种方式是在 CAD 界面里设置:打开选项对话框,切换到「文件」选项卡,展开「文字编辑器、词典和字体文件名」,找到「缺失 SHX 文件时的替代字体」,默认可能是simplex.shx或者某个大字体的替代文件。把它改成你希望全局兜底的字体,比如gbcbig.shx。这个设置本质上还是写入 FMP 文件,但界面上操作更安全,不会改坏文件编码。
实际项目中我常用混合方案:对已经稳定使用的字体,直接写进 FMP;对临时接收的图纸字体,用界面方式设置一个通用兜底。这样既能保证已有资源用对,又能防止陌生字体导致崩溃。
4.3 映射文件写错之后怎么排查
映射文件写错最典型的局面是:打开图纸不报缺字体了,但文字内容变了,所有「Φ±×÷」这类符号全部变成乱码。原因是整行映射里把符号字体也替换成了不支持该符号的文本字体。
排查分三步。第一步,打开 FMP 文件,Ctrl+F 搜索这个符号对应的原字体名,检查替代字体是不是符号类 SHX。第二步,确认替代字体和原字体是否属于同一字符集,比如把amgdt.shx映射到txt.shx就会丢符号。第三步,实在查不出,就把 FMP 中可疑行删掉,重新打开图看是否恢复报缺字体,如果恢复了,说明映射行确实有问题。
检查时建议用文本编辑器打开 FMP,不要用记事本双击写盘,也不要让 Excel 修改格式。文件编码必须是纯 ANSI,如果改成了 UTF-8 带 BOM,CAD 可能读不出第一行。这是血泪经验,很多人改了内容保存没反应,就是因为编码不对。
5. 避坑:乱码、问号、无法显示,三条高频踩坑记录
5.1 中文变成问号:大字体与 SHX 搭配错误
现象:标注里数字和英文字母正常,中文全部是问号,或显示成难看的方块。打开文字样式管理器,样式列表里字体名可能显示为txt.shx,而没有大字体。
原因:这张图纸的文字样式只指定了普通 SHX,没有指定大字体。中文字符在单字节 SHX 中找不到对应形定义,只能按缺失字符处理,显示为问号。还有一种情况是大字体选错了文件,选的本身是单字节的简化版,不含 CJK 映射。
解决:命令行输入STYLE,选中问题样式,点击「使用大字体」复选框,再把大字体选为hztxt.shx或gbcbig.shx。如果那个样式在图纸里用得多,别只改一个,打开「样式」对话框后把所有不含大字体的样式逐一检查。批量场景用前面提到的vla-setbigfontfile脚本,注意顺序。
5.2 繁体显示为空心方块:编码与形定义不匹配
现象:同一张图里,简体中文正常,繁体字符却显示为空心方块,光标选中文字时能看到方块里有线框。打印出来也是一团黑块。
原因:当前使用的大字体文件里只收录了简体汉字字形,繁体字符的形编号没有对应数据。部分老字号 SHX 文件按 GB2312 字符集做映射,而繁体字符落在 BIG5 或其他区段,形文件里根本没有这些码位的绘制指令。
解决:优先在合集里找一个明确标注「繁体」「BIG5」的 SHX,比如有些字体叫cht.shx、big5.shx。在样式里把大字体换成这个文件。如果找不到,不要硬凑,可以用系统宋体 TTF 替代这个样式,但要注意图纸中 gbcbig 特有的字符可能仍会缺失。换完字体后,用REGEN重生成一下,让所有文字按新字体刷新。
5.3 打印时文字变乱码:临时替换与永久替换的区别
现象:屏幕上文字显示正常,打印预览也正常,但印出来的图纸里某些标注变成了另一个字体,尺寸线间距错位。更严重的是一部分文字直接消失。
原因:CAD 出图时会重新解析字体。如果你用了字体映射,映射的替代字体只在显示侧有效,打印时可能走了不同的字体路径。另外,某些 SHX 是临时从文件对话框里手动指定加载的,没进样式表,打印时找不到原文件,直接回落成系统默认字体。
解决:打印前打开文字样式对话框,检查所有样式是否指向 Fonts 目录里的实际文件。接着清空 FMP 里的临时映射,改用样式内永久字体设置。最后一步,也是最釜底抽薪的办法:用「文字转曲线」功能把文字变成多段线。但不是所有 CAD 都内置这个命令,常见的是 Express Tools 里的TXTEXP,转换后文字无法编辑,所以只用在要归档发布的图纸副本上。从那以后我每次出图前都会先跑一遍字体检查,再决定要不要转曲线,这个流程救过不少次急。
6. 进阶:合并 SHX 文件、导出字体清单与统一字体库
6.1 批量检查图纸用到的字体
接手一个项目时,十几张图分别用了哪些 SHX 完全不知道。手动一张张打开看效率太低,跑一段 Python 脚本就能拉出清单:
import os import glob import ezdxf for dxf_path in glob.glob("项目图纸/*.dxf"): try: doc = ezdxf.readfile(dxf_path) except Exception as e: print(f"{dxf_path}: 读取失败 {e}") continue styles = doc.styles fonts = set() for style in styles: if style.dxf.font: fonts.add(style.dxf.font.lower()) if style.dxf.get("bigfont", ""): fonts.add(style.dxf.bigfont.lower()) print(f"{os.path.basename(dxf_path)}: {sorted(fonts)}")这个脚本只适用 DXF 格式。如果是 DWG,可以用转换工具先批量转 DXF,或者在 CAD 里用-SETVAR加 LISP 读取。脚本输出的字体名列表直接对合集里的文件做差集,就知道缺哪些了。我一般会执行完先看一遍,然后对着目录补文件。
6.2 用字形编辑器合并符号字体
有些项目需要把一批特殊符号塞到同一个 SHX 里,方便统一引用。SHX 是二进制文件,文本编辑器打不开,需要专门的 SHX 编辑工具。操作流程是:先打开基础字体,比如gdt.shx,再把另一个 SHX 里的符号逐字复制过来,注意保持形编号不冲突。
合并后必须做两项测试。第一项,用文字样式把该 SHX 设为普通字体,输入所有符号字符,逐个目测显示是否正确。第二项,用STYLE里设置的不同高度、宽度因子测试拉伸效果,因为符号形定义里的坐标可能用了绝对尺寸,拉伸后可能出现线条断开。合并后的文件如果只在一个项目里用,建议不要覆盖原始文件,另存为project_sym.shx,避免其他项目引用时行为变化。
6.3 维护团队共享字体库的习惯
团队协作时,字体库应该统一放在服务器共享目录,而不是散落在各人本地。每个人的 CAD 支持搜索路径里加同一个共享目录,新人来了复制路径配置就行,不需要把几百 MB 字体拷到本机。
版本管理有个原则:同一文件名只保留新版。SHX 文件更新时,先备份旧版,放到一个archive文件夹,再覆盖共享目录里的同名文件。这样既保证旧图纸按原字体名能找到新文件,也保留回滚能力。千万别用带日期的文件名到处发,CAD 图纸里字体名已经固定,换文件名等于让所有图纸缺字体。
还有一个习惯值得培养:每次收图后先运行一次字体清单脚本,把缺失字体自动归类成一份missing_fonts.txt。缺得少就直接复制补上,缺得多就核对原始单位的标准样式表。这套流程跑顺之后,字体问题基本不会再在项目中期突然冒出来。希望帮到你。
本文还有配套的精品资源,点击获取