本帖最后由 kozmosovia 于 2025-7-16 19:38 编辑
多数lsp文件会包含中文,普遍也是使用ansi的编码。这样的lsp以及相应编译的vlx,只能运行在lispsys=0的CAD中,如果lispsys=1了,ansi编码的包含汉字的lsp往往要么不能正确加载,要么加载后执行是显示乱码。而VLX则大概率加载都出错。
要避免这种尴尬,实现一个lsp可以同时运行在不同的lispsys上,可以将汉字转义,如同在IE浏览器中输入包含汉字或者空格的网址时,需要使用%AB和%20这样的16进制转义符号来代替以实现不受编码限制。同样的原理也可以用到lsp身上,源代码中直接将汉字转义,运行中再解码恢复,这个过程不受lispsys的影响,这样的lsp和编译出来的vlx,就可以毫无阻拦的同时运行在不同的lispsys的CAD上。同时,因为运行的代码都是ascii字符,无论lsp保存为何种编码模式,都不影响被加载。
比较成熟的一种汉字转义方式是用JavaScript的EncodeURI和DecodeURI。因此,只需要使用lisp调用javascript即可轻松实现。

网友答:
打开CAD,F1查看帮助搜索lispsys;
在程序里面想要拆分字串符,一般分3个情况进行拆分,就适应所有情况了。

网友答: 本帖最后由 kozmosovia 于 2025-7-18 09:45 编辑
运行的代码中带个汉字,如果lsp文件的编码和lispsys不匹配时,能100%正常运行会是拆盲盒靠运气了。要判断lispsys,直接getvar就行,不需要去string->list。
代码是自写自用倒是无所谓,如果要发给别人用,当别人的lispsys设置跟你的不一样时,用起来就会很麻烦:要么改lispsys,要么改lsp的编码。vlx改不了编码,只能改lispsys。而使用转义的方式,无论什么编码的lsp或者vlx,在无论什么lispsys上都可以正常运行。不需要用户为了用个命令非得改lispsys重启cad。
不转义的话,需要汉字时,就要做两个数字列表来替代,一个是lispsys=0时用,一个是lispsys=1时用。不觉得麻烦当然可以这么做:程序写好后再开个不同lispsys的CAD,获取汉字转出的对应数字列表是多少补充写入代码中。但是这么干可能还不如代码中直接保留汉字改编码来得快,唯一的限制是这种改法不支持VLX,改编码后还得再重新编译一个VLX。
网友答:
你没有get到这样做的要点,是无论用户的CAD的lispsys设置是什么,lsp或者VLX代码都能正常运行。而无需先改一次lispsys再重启才能用。越来越多的新人用CAD都是高版本,未来也注定要向UTF过渡的。不可能死守必须要lispsys=0,lsp/vlx才能用。网友答: 做编译器才是你永远的路网友答: VL函数中就有文字和字符代码互转。网友答:
自带的互转会受lispsys影响。
lispsys=1时,汉字会当成一个字节,ascii码大于255;
lispsys=0时,汉字是两个都不大于255的数字。
lispsys=1创建的数字列表在lispsys=0是转不回来的,反之也一样。
网友答: 为啥运行结果是nil呢
网友答:
这个方法不错,学习了。网友答:
win-10++acad2020
(JS-Host)返回nil网友答:
这个是针对lsp程序加载的。网友答:
(vl-list->string '(200 203 195 241 97 98 99 215 233 214 175 52 53 50 52 187 250 185 185 100 102 97 113 52 52))网友答: 本帖最后由 kozmosovia 于 2025-7-17 21:33 编辑
当lispsys=1时,结果就乱码了
多数lsp文件会包含中文,普遍也是使用ansi的编码。这样的lsp以及相应编译的vlx,只能运行在lispsys=0的CAD中,如果lispsys=1了,ansi编码的包含汉字的lsp往往要么不能正确加载,要么加载后执行是显示乱码。而VLX则大概率加载都出错。
要避免这种尴尬,实现一个lsp可以同时运行在不同的lispsys上,可以将汉字转义,如同在IE浏览器中输入包含汉字或者空格的网址时,需要使用%AB和%20这样的16进制转义符号来代替以实现不受编码限制。同样的原理也可以用到lsp身上,源代码中直接将汉字转义,运行中再解码恢复,这个过程不受lispsys的影响,这样的lsp和编译出来的vlx,就可以毫无阻拦的同时运行在不同的lispsys的CAD上。同时,因为运行的代码都是ascii字符,无论lsp保存为何种编码模式,都不影响被加载。
比较成熟的一种汉字转义方式是用JavaScript的EncodeURI和DecodeURI。因此,只需要使用lisp调用javascript即可轻松实现。

- (Defun JS-Host (/ RTN)
- "JS-Host"
- (foreach abc '("{e8540e26-d20e-483f-9fd5-a5a3553a7556}"
- "{0e59f1d5-1fbe-11d0-8ff2-00a0d10038bc}"
- )
- (and (null rtn)
- (setq rtn (vlax-get-or-create-object abc))
- (vlax-put-property rtn "Language" "JScript")
- )
- )
- rtn
- )
- (Defun JS-EnCodeURI (txt / VLO)
- "JS-EnCodeURI"
- (if (setq vlo (JS-Host))
- (vlax-variant-value
- (vlax-invoke-method vlo "Run" "encodeURI" txt "")
- )
- )
- )
- (Defun JS-DecodeURI (txt / VLO)
- "JS-DecodeURI"
- (if (setq vlo (JS-Host))
- (vlax-variant-value
- (vlax-invoke-method vlo "Run" "decodeURI" txt "")
- )
- )
- )
- (Defun c:tt ()
- ;;; (JS-EncodeURI "人民abc组织4524机构dfaq44")
- (alert
- (JS-DecodeURI
- "%E4%BA%BA%E6%B0%91abc%E7%BB%84%E7%BB%874524%E6%9C%BA%E6%9E%84dfaq44"
- )
- )
- )
网友答:
kozmosovia 发表于 2025-7-17 22:49
你没有get到这样做的要点,是无论用户的CAD的lispsys设置是什么,lsp或者VLX代码都能正常运行。而无需先 ...
打开CAD,F1查看帮助搜索lispsys;
在程序里面想要拆分字串符,一般分3个情况进行拆分,就适应所有情况了。

- ;字串符str->拆分为单个"中文"->'("中" "文")
- (defun WZ_CF (str / str str2 strs)
- (setq strs '())
- (while (/= str "")
- (cond
- ((null (cadr (vl-string->list "中"))) (setq str2 (substr str 1 1) str (substr str 2)));中文也是一个字串符
- ((> (ascii (substr str 1 1)) 128) (setq str2 (substr str 1 2) str (substr str 3)) );中文是两个字串符
- (t (setq str2 (substr str 1 1) str (substr str 2)) );英文拆分
- )
- (setq strs (cons str2 strs))
- )
- (reverse strs)
- )
网友答: 本帖最后由 kozmosovia 于 2025-7-18 09:45 编辑
运行的代码中带个汉字,如果lsp文件的编码和lispsys不匹配时,能100%正常运行会是拆盲盒靠运气了。要判断lispsys,直接getvar就行,不需要去string->list。
代码是自写自用倒是无所谓,如果要发给别人用,当别人的lispsys设置跟你的不一样时,用起来就会很麻烦:要么改lispsys,要么改lsp的编码。vlx改不了编码,只能改lispsys。而使用转义的方式,无论什么编码的lsp或者vlx,在无论什么lispsys上都可以正常运行。不需要用户为了用个命令非得改lispsys重启cad。
不转义的话,需要汉字时,就要做两个数字列表来替代,一个是lispsys=0时用,一个是lispsys=1时用。不觉得麻烦当然可以这么做:程序写好后再开个不同lispsys的CAD,获取汉字转出的对应数字列表是多少补充写入代码中。但是这么干可能还不如代码中直接保留汉字改编码来得快,唯一的限制是这种改法不支持VLX,改编码后还得再重新编译一个VLX。
网友答:
437271963 发表于 2025-7-17 22:42
lispsys设置为1或2;
都需要关闭CAD界面,重新打开才可以。
你没有get到这样做的要点,是无论用户的CAD的lispsys设置是什么,lsp或者VLX代码都能正常运行。而无需先改一次lispsys再重启才能用。越来越多的新人用CAD都是高版本,未来也注定要向UTF过渡的。不可能死守必须要lispsys=0,lsp/vlx才能用。网友答: 做编译器才是你永远的路网友答: VL函数中就有文字和字符代码互转。网友答:
gzcsun 发表于 2025-7-16 18:49
VL函数中就有文字和字符代码互转。
自带的互转会受lispsys影响。
lispsys=1时,汉字会当成一个字节,ascii码大于255;
lispsys=0时,汉字是两个都不大于255的数字。
lispsys=1创建的数字列表在lispsys=0是转不回来的,反之也一样。
网友答: 为啥运行结果是nil呢
网友答:
这个方法不错,学习了。网友答:
win-10++acad2020(JS-Host)返回nil网友答:
kozmosovia 发表于 2025-7-16 19:12
自带的互转会受lispsys影响。
lispsys=1时,汉字会当成一个字节,ascii码大于255;
lispsys=0时,汉字 ...
这个是针对lsp程序加载的。网友答:
kozmosovia 发表于 2025-7-16 19:12
自带的互转会受lispsys影响。
lispsys=1时,汉字会当成一个字节,ascii码大于255;
lispsys=0时,汉字 ...
(vl-list->string '(200 203 195 241 97 98 99 215 233 214 175 52 53 50 52 187 250 185 185 100 102 97 113 52 52))网友答: 本帖最后由 kozmosovia 于 2025-7-17 21:33 编辑
gzcsun 发表于 2025-7-17 20:50
(vl-list->string '(200 203 195 241 97 98 99 215 233 214 175 52 53 50 52 187 250 185 185 100 102 97 ...
当lispsys=1时,结果就乱码了