吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1719|回复: 14
收起左侧

[其他原创] CAD已替换tssdeng.shx钢筋字体依旧显示问号

[复制链接]
IceYer 发表于 2024-5-11 13:56
本帖最后由 IceYer 于 2024-5-11 14:04 编辑

一、问题描述

最近打开一个CAD文件显示问号,用看图王发现是钢筋字体,像往常一样替换tssdeng.shx字体。

CAD缺字体
看图王字体正常

二、初步测试

  1. 在CAD中通过PR命令查看对应的字体样式,之后输入ST命令找到对应样式,替换tssdeng.shx,操作后发现依旧显示问号,emmmm。
    CAD
  2. 回到看图王中,确认就是钢筋符号。我们知道在CAD中,单行文字可以通过%%数字的形式来输入CAD钢筋符号,所以这里我们测试在这段文本后面输入%%132,可以发现钢筋字体确实被转换了。
    %%132
    PS:CAD支持直接输入Unicode编码,比如%%132也可以用\u+0084

三、深入分析

  1. 既然肉眼看不出问题,那就复制到文本文档中,用WinHex一探究竟吧。
    WinHex
  2. 这里发现我们正常显示的Ⅲ级钢筋字体是C2 84,而显示异常的是EE 94 B2,这里我们就需要查看tssdeng.shx字体了,看看是不是缺少某些字库导致的。
  3. 在CAD中的SHX是矢量字库字体,平常字体编辑器无法预览,这里可以用ShxViewerSHX2SHP两款软件进行查看。
    ShxViewer
  4. 细心的会发现,我们在CAD输入的%%132中的132转换十六进制就等于84,所以我们在这两款软件中找到84的位置都可以看到钢筋符号,同理我们也知道了相邻位置的钢筋符号:
16进制 10进制 解释
\u+0082 %%130 Ⅰ级钢筋
\u+0083 %%131 Ⅱ级钢筋
\u+0084 %%132 Ⅲ级钢筋
\u+0085 %%133 Ⅳ级钢筋
...
  1. 但是我们在WinHex中,显示C2 84,而不是84,为什么会多一个C2呢?EE 94 B2又如何计算它在字体中所对应的位置呢?
  2. 带着这些疑问我们首先需要了解UTF-8 编码规则
U+0000 到 U+007F(1字节): 
  这个范围的字符只需要一个字节,直接与 ASCII 码相同,从 `0x00` 到 `0x7F`。

U+0080 到 U+07FF(2字节):
  这个范围的字符需要两个字节来编码。
  第一个字节从 `110xxxxx` 开始,第二个字节从 `10xxxxxx` 开始。
  这里的 `x` 代表原始Unicode代码点的比特。

U+0800 到 U+FFFF(3字节):
  这个范围的字符需要三个字节来编码。
  第一个字节从 `1110xxxx` 开始,随后两个字节都从 `10xxxxxx` 开始。

U+10000 到 U+10FFFF(4字节):
  这个范围的字符需要四个字节来编码。
  第一个字节从 `11110xxx` 开始,随后三个字节都从 `10xxxxxx` 开始。
  1. 这里说一下我的理解,有误请指出,首先是正向思维
`U+0084`属于`U+0080 到 U+07FF`区间,所以最后应该得到两个字节;
`84`转换二进制得到`1000 0100`;
根据字节高低位,我们可以先算第二个字节,第二个字节从 `10xxxxxx` 开始,取`1000 0100`后六位`00 0100`与 `10xxxxxx` 拼接得到`1000 0100`,转换十六进制得到`84`;
第一个字节从 `110xxxxx` 开始,因为刚刚`1000 0100`用掉了6位,我们还剩下2位,即`10`,拼接得到`110xxx10`,但是这里我们需要5位,所以补零占位,得到`1100 0010`,转换十六进制得到`C2`;
将两个字节拼接得到`C2 84`两个字节。
  1. 接下来是逆向思维
`C2 84`是两个字节,遵循UTF-8 编码规则,即第一个字节从 `110xxxxx` 开始,第二个字节从 `10xxxxxx` 开始;
`C2`转换二进制`1100 0010`取后5位得到`0 0010`;
`84`转换二进制`1000 0100`取后6位得到`00 0100`;
将两个二进制拼接得到`0 0010 00 0100`,去掉前面多余的0整理后`1000 0100`,转换十六进制得到`84`。
  1. 最后让我们计算EE 94 B2
`EE 94 B2`是三个字节,遵循UTF-8 编码规则,即第一个字节从 `1110xxxx` 开始,随后两个字节都从 `10xxxxxx` 开始;
`EE`转换二进制`1110 1110`取后4位得到`1110`;
`94`转换二进制`1001 0100`取后6位得到`01 0100`;
`B2`转换二进制`1011 0010`取后6位得到`11 0010`;
将三个二进制拼接得到`1110 01 0100 11 0010`整理后`1110 0101 0011 0010`,转换十六进制得到`E532`。
  1. 使用上述两款软件也验证了E532位置不存在对应的字形。既然没有,那咱就手动添加一个试试。
    E532
  2. 因SHX文件不能直接修改,需要反编译成SHP文件才能修改,碰巧这两款软件都支持反编译SHP。
    反编译SHP
  3. 将得到的SHP文件用记事本打开,我们可以搜索找到*132(84)开头到下一个*开头中间内容就是*132的字形内容,我们把它复制到文件末尾,修改开头为*58674(E532),然后保存。

*132
*58674

  1. 回到CAD中输入COMPILE命令,找到更改后的tssdeng.shp文件,选择打开,将自动编译成tssdeng.shx文件。关闭CAD,将新的tssdeng.shx文件替换到CAD的fonts文件夹中,再次启动CAD,问题得到解决。其他钢筋符号或者生僻字同理。

COMPILE
Fonts
CAD

  1. 当然,新的tssdeng.shx字体文件我们放在SHX2SHP中也能找到E532位置的字形了。
    SHX2SHP

四、后记

  1. 在使用SHX2SHP时,如果字形存在引用的情况下,比如2,开头是字形,7,*xx开头是引用*xx字形。在使用Code view显示的不是引用的字形;
  2. 在使用ShxViewer时,反编译shp文件头部会加入编译信息会导致COMPILE命令报错,需要删除;同时*引用的位置有时显示10进制有的显示16进制,貌似超过ff就会显示16进制?而且软件显示的数量貌似也有限制,但在SHX2SHP根据位置可以单独查看。
  3. 所以上面两个软件配合着来吧。
  4. 其实研究到中途时,偶然发现网络上有新一版的tssdeng.shx文件,内部已经包含了本次E532的字形,所以这里留一下研究思路吧,方便后面手动添加字形,也可以解决生僻字的问题,比如这篇文章:制作一个含生僻字的矢量字体文件-CSDN博客

五、下载

下载和排版直接看这里吧https://www.iceyer.cn/index.php/archives/226

免费评分

参与人数 4吾爱币 +10 热心值 +3 收起 理由
stechas + 1 + 1 热心回复!
ming_2794 + 1 谢谢@Thanks!
0120 + 1 + 1 热心回复!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

陈维巍 发表于 2024-5-11 17:10
业界毒瘤天正干的好事,安装天正插件可以解决。不过哥们,工程还能干?
Qualy 发表于 2024-5-11 17:18
lzspain 发表于 2024-5-11 16:11
如果把“?”删除,重新输入对应等级钢筋的字符就能正常显示,是不是更简单?
JieW_L 发表于 2024-5-11 17:16
简单来说就是换一个能正常显示钢筋符号的 tssdeng
 楼主| IceYer 发表于 2024-5-13 22:18
本帖最后由 IceYer 于 2024-5-14 08:11 编辑
lzspain 发表于 2024-5-11 16:11
如果把“?”删除,重新输入对应等级钢筋的字符就能正常显示,是不是更简单?

可以直接复制那个问号,不要手打问号,然后用find查找替换%%132这种,但是需要注意钢筋字符级别
 楼主| IceYer 发表于 2024-5-14 15:02
陈维巍 发表于 2024-5-11 17:10
业界毒瘤天正干的好事,安装天正插件可以解决。不过哥们,工程还能干?

这个就是字体不全,已经安装了T20 10版本
kiomail 发表于 2024-5-18 21:59
CAD字体问题烦的很啊
古月诌 发表于 2024-7-12 17:23
陈维巍 发表于 2024-5-11 17:10
业界毒瘤天正干的好事,安装天正插件可以解决。不过哥们,工程还能干?

主要是思路这么清晰,技术深度广度也够了,还继续干工程?
ming_2794 发表于 2024-7-12 21:43
,这技术杠杠的!,钻研精神值得学习!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 07:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表