kozmosovia 发表于 2024-5-17 20:31:59

同一VLX同时运行在ANSI和UTF模式下

本帖最后由 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解码。

kozmosovia 发表于 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
          )
)

p-3-ianlcc 发表于 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档是简体的
希望可以直接在繁体系统上使用

kozmosovia 发表于 2024-5-21 09:26:55

crtrccrt 发表于 2024-5-21 09:23
请教,如何激活下面两个函数,mjtd论坛的办法不能激活
pack-string->list
pack-list->string

附件不是有fas吗?直接先加载那个fas或者编译时加在第一个就行。用激活的方法,还是要先加载或者临时写个tranf.fas出来,不如直接用附件的fas加载来得简单。

gzcsun 发表于 2024-5-17 20:53:01

本帖最后由 gzcsun 于 2024-5-17 20:55 编辑

我一般
设置lispsys=0
某些字符出现问号就 vl-string->list和vl-list->string:lol

你有种再说一遍 发表于 2024-5-18 01:55:04

我想到最好的方法是...做一个编译器把lisp编译成dll或者arx

kozmosovia 发表于 2024-5-18 09:12:25

DLL或者ARX会有CAD版本问题,把本来两个VLX的问题变成多个DLL/ARX的问题。简单问题复杂化了。

p-3-ianlcc 发表于 2024-5-18 12:27:59

谢谢分享这么好的资讯
如果可以像dll或arx,让lsp、fas、vlx里面的中文字体不受限于“使用者autoad或系统中文字型”的限制最好
譬如:可以让简体的lsp、fas、vlx可以正常在“繁体系统或繁体的autocad”上使用、而且不会有乱码

guosheyang 发表于 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的数据结构的话,直接按照你的规则编译,这样就不用管这些乱七八糟问题了

kozmosovia 发表于 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使用的语言自动切换使用

p-3-ianlcc 发表于 2024-5-19 00:40:14

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

太棒了…这是福音
可以教一下怎么弄的吗?

烟盒迷唇 发表于 2024-5-19 09:57:37

这个FAS也是用的内部函数吗
页: [1] 2
查看完整版本: 同一VLX同时运行在ANSI和UTF模式下