如何在AutoCAD VBA中正确获取阿拉伯/波斯SHX文本的完整字符内容?
解决AutoCAD VBA读取阿拉伯/波斯SHX文本时字符变为
?的问题 问题根源在于AutoCAD的TextString属性默认使用系统ANSI代码页(如1252)读取文本,而阿拉伯/波斯SHX字体的字符属于代码页1256,无法识别的字符会被替换为?。AutoCAD属性面板会自动根据字体对应的代码页解析字符,所以能正常显示。以下是两种可行解决方案:
方法1:修改DWG代码页并转换编码
通过临时修改DWG的代码页为阿拉伯语代码页(1256),再将读取的ANSI字符串转换为Unicode,即可获取完整字符:
Private Sub convertBtn_Click() Dim txt As String Dim textObject As AcadText Dim actSelSet As AcadSelectionSet Dim originalCodePage As String ThisDrawing.Activate ' 保存原始代码页,避免影响后续操作 originalCodePage = ThisDrawing.GetVariable("DWGCODEPAGE") ' 设置为阿拉伯语代码页 ThisDrawing.SetVariable "DWGCODEPAGE", "1256" Set actSelSet = ThisDrawing.PickfirstSelectionSet For Each i In actSelSet If TypeOf i Is AcadText Then ' 读取文本并转换为Unicode txt = StrConv(i.TextString, vbUnicode, 1256) Debug.Print txt textStringConversion.strToAsc txt End If Next i ' 恢复原始代码页 ThisDrawing.SetVariable "DWGCODEPAGE", originalCodePage End Sub
方法2:读取DXF原始文本并映射字体形状码
如果使用的是自定义SHX字体(非标准1256编码),需要直接读取DXF中的原始形状码文本,再根据SHX字体的字符映射表转换为Unicode:
步骤1:读取DXF原始文本和字体信息
Private Sub convertBtn_Click() Dim rawTxt As String Dim textObject As AcadText Dim actSelSet As AcadSelectionSet Dim dxfData As Variant Dim styleName As String Dim styleObj As AcadTextStyle ThisDrawing.Activate Set actSelSet = ThisDrawing.PickfirstSelectionSet For Each i In actSelSet If TypeOf i Is AcadText Then ' 读取DXF代码1的原始形状码文本 i.GetDxfData 1, dxfData rawTxt = dxfData(0) ' 获取文本样式对应的SHX字体文件路径 styleName = i.StyleName Set styleObj = ThisDrawing.TextStyles(styleName) Debug.Print "原始形状码:" & rawTxt Debug.Print "关联SHX字体:" & styleObj.FontFile ' 调用自定义映射函数转换为Unicode ' Dim convertedTxt As String ' convertedTxt = MapShxCodesToUnicode(rawTxt, styleObj.FontFile) ' textStringConversion.strToAsc convertedTxt End If Next i End Sub
步骤2:实现SHX字体映射逻辑
SHX是二进制字体格式,需要解析其内部的形状定义与字符映射规则。你需要编写代码读取SHX文件的二进制数据,提取每个形状码对应的Unicode字符(可参考AutoCAD官方DXF文档中关于SHX字体的结构说明)。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

