难道这是 2021 关于支持UNICODE 的重大bug?如是则对Lisp影响巨大。
本帖最后由 nihaogemen 于 2020-5-1 14:59 编辑我为了折腾UNICODE码,安装了2021.
发现支持unicode 居然因为LISPSYS变量的不同而不同。
我在UE中写了一个打印 3的3次方。这么一个最小程序。编码是UTF-8.
然后打开ACAD2021.
将LISPSYS 设为0然后重启ACAD。加载TTT.lsp
CAD不能识别“3次方”这个字符。这时候 (strlen "汉字CAD") =7. 换句话说ACAD 认为汉字是2个字符。
将LISPSYS 设为1然后重启ACAD。加载TTT.lsp. 能显示3的3次方。
这时候 (strlen "汉字CAD") =5. 换句话说ACAD 认为汉字是1个字符。
如果ACAD启动是 LISPSYS=0,执行(setvar "LISPSYS" 2)后, (strlen "汉字CAD") 依然等于7.
那我写LISP怎么搞,支持UNICODE有什么用?总不能先判断LISPSYS,然后再让用户重启CAD吧。
还请方家指教
所以说这是害人撒
脑残的人才会去更改基本函数的功能
这意味着
必须自定义一个函数
取代strlen计算字符长度
楼上说得对。所有包含双字节字符的长度判定语句在2020之后都会有问题。兼容性上应该
(strlen-w "字符串")
如果经常很多插件,特别是含字符处理的插件,建议没必要不用用2021了,对于lisp作者,如果想写兼容2021的程序只能重写strlen函数 CAD自身支持UNICODE,但是并没说Lisp也支持UNICODE啊 本帖最后由 e2002 于 2020-5-5 20:47 编辑
你想歪了,先读取LISPSYS的值用于判断当前是否是 Unicode状态,然后再用不同的算法就是了(这会增加一些判断代码)。
本帖最后由 e2002 于 2020-5-5 20:55 编辑
2021之前的版本,lisp源码文件,请勿使用utf8编码保存,否则很可能出现特定字符导致括号匹配识别错误等问题。另外,如果有中文字符,再用AutoCAD 2020的 vlide打开就会中文乱码(因为 vlide 并不支持 utf8编码的 lisp文件!2021如果设置lispsys /= 1,这个2021带的vlide是否支持utf8编码的lisp文件请哪位测试并在后面恢复一下?)
目前我的办法是,windows中默认使用gb18030编码保存lisp文件,然后用2020版创建fas与vlx;然后在需要时,另存一个 utf8编码的版本,用于在2021中创建unicode版本的 fas与vlx。 zixuan203344 发表于 2020-5-4 08:48
CAD自身支持UNICODE,但是并没说Lisp也支持UNICODE啊
2021版的Lisp还真的支持UNICODE e2002 发表于 2020-5-5 20:44
你想歪了,先读取LISPSYS的值用于判断当前是否是 Unicode状态,然后再用不同的算法就是了(这会增加一些判 ...
因为LISPSYS 是启动后生效的。所以读取LISPSYS,好像并不能解决如下问题:
CAD启动后,LISPSYS=0
你执行一下LISPSYS=1(不能排除其他插件有这个操作,因为用户可能还在用其他插件)
这时你读取到的LISPSYS是1,但实际效果是LISPSYS=0
这看上去有点抬杠的味道。但作为一个平台型软件的ACAD,不应该给用户制造这种可以避免的麻烦。 nihaogemen 发表于 2020-5-8 17:45
因为LISPSYS 是启动后生效的。所以读取LISPSYS,好像并不能解决如下问题:
CAD启动后,LISPSYS=0
你执 ...
确有这种特殊情况,这个只能是自己在改动了 LISPSYS的值之后,就自己手动立即退出重启来解决了。
全面转向Unicode是必然趋势,这个大家就不要逆历史潮流了。
就如同这才过了多少年, 64位系统已经占据主流地位了。该改的代码,改就是了,无人维护的,也只能放弃或者找替代品。 e2002 发表于 2020-5-10 11:06
确有这种特殊情况,这个只能是自己在改动了 LISPSYS的值之后,就自己手动立即退出重启来解决了。
全面转 ...
问题是现在lisp开发都进入沉寂期了,非商业开发的代码很多都是很多年前的东西,早已经没人维护了,这种会让现有代码失效的改变真的挺失败的,所以说应该参考windows进入Unicode时用一大堆-a,-w函数区分字符串函数版本,不影响老程序才是明智的
页:
[1]
2