同一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解码。
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
)
)
kozmosovia 发表于 2024-5-20 16:56
(Defun VLDCL-UTFMSG (msg)
(cond ((or (= (getvar "SysCodePage") "ANSI_936")
(= (getvar "L ...
谢谢大师的分享!
里面有Sample,再来看看怎麽弄比较好
现在的主要问题是,有一些fas档是简体的
希望可以直接在繁体系统上使用 crtrccrt 发表于 2024-5-21 09:23
请教,如何激活下面两个函数,mjtd论坛的办法不能激活
pack-string->list
pack-list->string
附件不是有fas吗?直接先加载那个fas或者编译时加在第一个就行。用激活的方法,还是要先加载或者临时写个tranf.fas出来,不如直接用附件的fas加载来得简单。 本帖最后由 gzcsun 于 2024-5-17 20:55 编辑
我一般
设置lispsys=0
某些字符出现问号就 vl-string->list和vl-list->string:lol
我想到最好的方法是...做一个编译器把lisp编译成dll或者arx DLL或者ARX会有CAD版本问题,把本来两个VLX的问题变成多个DLL/ARX的问题。简单问题复杂化了。 谢谢分享这么好的资讯
如果可以像dll或arx,让lsp、fas、vlx里面的中文字体不受限于“使用者autoad或系统中文字型”的限制最好
譬如:可以让简体的lsp、fas、vlx可以正常在“繁体系统或繁体的autocad”上使用、而且不会有乱码 感谢大佬的经验分享! kozmosovia 发表于 2024-5-18 09:12
DLL或者ARX会有CAD版本问题,把本来两个VLX的问题变成多个DLL/ARX的问题。简单问题复杂化了。
有Fas和Vlx的数据结构的话,直接按照你的规则编译,这样就不用管这些乱七八糟问题了 本帖最后由 kozmosovia 于 2024-5-18 22:10 编辑
p-3-ianlcc 发表于 2024-5-18 12:27
谢谢分享这么好的资讯
如果可以像dll或arx,让lsp、fas、vlx里面的中文字体不受限于“使用者autoad或系统 ...
这个是可以的,我写的VLDCL就是底层直接同时支持简中、繁体和英文。根据系统和CAD使用的语言自动切换使用 kozmosovia 发表于 2024-5-18 21:49
这个是可以的,我写的VLDCL就是底层直接同时支持简中、繁体和英文。根据系统和CAD使用的语言自动切换使用
太棒了…这是福音
可以教一下怎么弄的吗? 这个FAS也是用的内部函数吗
页:
[1]
2