AutoCAD 2021 在 2020 年 3 月既已发布,新增加了一系列功能:其中两个功能是
- 为 VisualStudio Code 提供了 AutoLisp 扩展,从而可以使用 VS Code 编辑和调试 AutoLisp 程序。
- 为 AutoLisp 提供了 Unicode 支持。
这里,第二个新功能为从前编写的 AutoLisp 程序带来了一定的问题。
主要问题
首先我们来测试一句代码:
1 | (substr "I am chinese." 3 4) |
在 AutoCAD 任一版本中,返回的结果都是 am c
,substr
函数的第二个字符串参数是被截取的字符串,第三个参数表示字符起始位置,第四个参数表示字符长度。在西文中,一个字符均采用一个字节来表达,这条语句的返回值为 am c
则是显然的。
如果换成了一个包含中文的字符串呢,我们知道,在 GBK 编码中,汉字等 CJK 字符是采用双字节编码,在 AutoCAD 2020 以前的版本中并不完全支持这种双字节编码的字符,实际函数按字节数来截取字符串,那么:
1 | (substr "我是一个中国人" 3 4) |
这样一句代码的返回值就变成了字符串 是一
,这很好理解,从这个字符串第 3
个字节开始后 4
个字节的字符串显然是 是一
二字,这里必须考虑汉字等双字节或多字节编码的问题。而在 AutCAD 2021 中,这段代码的返回值变成了 一个中国
,显然,这是由于为 AutoLisp 提供了 Unicode 支持后,函数能够认出多字节编码的字符,从第 3
个字符起,后面 4
个字符组成的字符串显然是 一个中国
。这就带来了同一语句在不同平台下返回值不同的问题。
AutoCAD 对这个问题的处理
AutoCAD 2021 对这个问题的处理是新增加了一个系统变量 LISPSYS
,其值与说明如下:
值 | 说明 |
---|---|
0 | Visual LISP IDE (VL IDE) 被设置为默认编辑器,AutoLISP 函数不完全支持 Unicode 字符。AutoLISP 源 (LSP) 文件在保存和编译时使用 ASCII (MBCS) 字符集。 |
1 | Visual Studio (VS) Code 被设置为默认编辑器,AutoLISP 函数完全支持 Unicode 字符。AutoLISP 源 (LSP) 文件在保存时,使用在 VS Code 中设置的编码,在编译时,它们使用 Unicode 字符集。 |
2 | Visual Studio (VS) Code 被设置为默认编辑器,AutoLISP 函数完全支持 Unicode 字符。AutoLISP 源 (LSP) 文件在保存时,使用在 VS Code 中设置的编码,在编译时,它们使用 ASCII (MBCS) 字符集。 |
这其中:更改 LISPSYS
系统变量的当前值后,必须重新启动 AutoCAD 才能切换 AutoLISP 开发环境。
我们进行一下相应的测试,修改 AutoCAD 系统变量 LISPSYS
值为 0
时,上述代码的返回值就变成了 是一
,而当系统变量 LISPSYS
值为 1
或 2
时,上述代码的返回值为 一个中国
。
BRTools 的解决办法
BRTools 编写的命令中,有相当的字符串处理工作,其中很多会涉及到中文字符串的处理,对这个问题可以有两类解决办法。
短期的解决办法
短期内的解决办法是在使用 AutoCAD 2021 时将 LISPSYS
设置为 0
,不去更改源代码的内容,目前推荐用户先采用这种方法救急。
长期解决办法
更改支持 Unicode 的 Lisp 代码
这个工作首先需要找出所有涉及字符串操作的函数,编写对应不同编码方案的两种函数,通过 AutoCAD 的版本来判断需要使用的函数,这个工作好像是个坑,暂时没有工夫去填了,虽然这个坑值得填。