明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1675|回复: 17

[经验] 同一VLX同时运行在ANSI和UTF模式下

  [复制链接]
发表于 2024-5-17 20:31:59 | 显示全部楼层 |阅读模式
本帖最后由 kozmosovia 于 2024-5-18 22:33 编辑

从2021开始,CAD默认是UTF编码模式,以往在传统的ANSI模式下编译的VLX,如果代码中有中文的内容或者提示,在UTF模式下是无法正常运行和显示的,要在UTF模式下运行,需要两种处理方式:
1:设置lispsys=1,并将原始的lsp文件的编码改为UTF-8,然后使用makelispapp重新编译。
2:设置lispsys=2,保持原始的lsp文件的编码为ANSI,然后使用makelispapp重新编译。
这样编译后的VLX,将只能在UTF模式下运行,遇到早期版本CAD只有ANSI模式时,也是无法正常运行的。

要解决这个问题,就需要特殊处理一下代码中的汉字,将其转换成不是汉字。这样就不会受编码的影响。同样的,也有两种解决方案:
1:将汉字转换为base64编码。程序运行中需实时将base64解码为实际汉字。
2:将汉字转换为另外的信息模式,如数字列表,VLISP默认的vl-string->list和vl-list->string可以实现这种转换,不过很不幸,这两个函数式也会受编码系统的影响,UTF模式下,对汉字执行vl-string->list,生成的数字会大于256,这个数字在ANSI模式下,无法用vl-list->string恢复回正确的汉字。

最简单的解决方案是用保留函数pack-string->list和pack-list->string替代vl-string->list和vl-list->string。可以使用tranf将这个两个函数引入,论坛可以找到方法;也可以直接使用附件的string2list.fas,提前将其加载或者编译中将其放在文件列表第一个。

使用pack-string->list和pack-list->string处理过的源代码无论经哪种编码模式下进行编译,都可以无缝的直接运行在两种编码模式系统上,无需为特定的编码模式进行单独的对应编译。

pack-string->list是一种加密式的转换,对相同的原始字符串,每次的输出结果都是不一样的,但是不会影响pack-list->string解码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 3明经币 +3 收起 理由
baitang36 + 1 很给力!
guosheyang + 1 赞一个!
飞雪神光 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-5-20 16:56:47 | 显示全部楼层
p-3-ianlcc 发表于 2024-5-19 00:40
太棒了…这是福音
可以教一下怎么弄的吗?

(Defun VLDCL-UTFMSG (msg)
  (cond        ((or (= (getvar "SysCodePage") "ANSI_936")
             (= (getvar "Locale") "CHS")
             (wcmatch (vlax-product-key) "*804")
         )
         (AQX:Base64Decode (car msg))
        )
        ((or (= (getvar "SysCodePage") "ANSI_950")
             (= (getvar "Locale") "CHT")
             (wcmatch (vlax-product-key) "*404")
         )
         (AQX:Base64Decode (cadr msg))
        )
        (t (caddr msg))
  )
)
Sample:
(setq slb (getfiled (vldcl-UTFMSG
                      '("0aHU8bvDtcbGrL/izsS8/g0K"
                        "33iT8bvDn/TGrI7szsS8/g0K"
                        "Select a SLB file"
                       )
                    )
                    ""
                    "SLB"
                    8
          )
)
发表于 2024-5-20 17:37:53 | 显示全部楼层
kozmosovia 发表于 2024-5-20 16:56
(Defun VLDCL-UTFMSG (msg)
  (cond        ((or (= (getvar "SysCodePage") "ANSI_936")
             (= (getvar "L ...

谢谢大师的分享!
里面有Sample,再来看看怎麽弄比较好
现在的主要问题是,有一些fas档是简体的
希望可以直接在繁体系统上使用
 楼主| 发表于 2024-5-21 09:26:55 | 显示全部楼层
crtrccrt 发表于 2024-5-21 09:23
请教,如何激活下面两个函数,mjtd论坛的办法不能激活
pack-string->list
pack-list->string

附件不是有fas吗?直接先加载那个fas或者编译时加在第一个就行。用激活的方法,还是要先加载或者临时写个tranf.fas出来,不如直接用附件的fas加载来得简单。
发表于 2024-5-17 20:53:01 | 显示全部楼层
本帖最后由 gzcsun 于 2024-5-17 20:55 编辑

我一般
设置lispsys=0
某些字符出现问号就 vl-string->list和vl-list->string
发表于 2024-5-18 01:55:04 | 显示全部楼层
我想到最好的方法是...做一个编译器把lisp编译成dll或者arx
 楼主| 发表于 2024-5-18 09:12:25 | 显示全部楼层
DLL或者ARX会有CAD版本问题,把本来两个VLX的问题变成多个DLL/ARX的问题。简单问题复杂化了。
发表于 2024-5-18 12:27:59 | 显示全部楼层
谢谢分享这么好的资讯
如果可以像dll或arx,让lsp、fas、vlx里面的中文字体不受限于“使用者autoad或系统中文字型”的限制最好
譬如:可以让简体的lsp、fas、vlx可以正常在“繁体系统或繁体的autocad”上使用、而且不会有乱码
发表于 2024-5-18 14:58:23 | 显示全部楼层
感谢大佬的经验分享!
发表于 2024-5-18 15:36:58 | 显示全部楼层
kozmosovia 发表于 2024-5-18 09:12
DLL或者ARX会有CAD版本问题,把本来两个VLX的问题变成多个DLL/ARX的问题。简单问题复杂化了。

有Fas和Vlx的数据结构的话,直接按照你的规则编译,这样就不用管这些乱七八糟问题了
 楼主| 发表于 2024-5-18 21:49:26 | 显示全部楼层
本帖最后由 kozmosovia 于 2024-5-18 22:10 编辑
p-3-ianlcc 发表于 2024-5-18 12:27
谢谢分享这么好的资讯
如果可以像dll或arx,让lsp、fas、vlx里面的中文字体不受限于“使用者autoad或系统 ...

这个是可以的,我写的VLDCL就是底层直接同时支持简中、繁体和英文。根据系统和CAD使用的语言自动切换使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-5-19 00:40:14 | 显示全部楼层
kozmosovia 发表于 2024-5-18 21:49
这个是可以的,我写的VLDCL就是底层直接同时支持简中、繁体和英文。根据系统和CAD使用的语言自动切换使用

太棒了…这是福音
可以教一下怎么弄的吗?
发表于 2024-5-19 09:57:37 | 显示全部楼层
这个FAS也是用的内部函数吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 12:43 , Processed in 0.198472 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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