AutoCAD2021新特性带来的问题

AutoCAD 2021 在 2020 年 3 月既已发布,新增加了一系列功能:其中两个功能是

  • 为 VisualStudio Code 提供了 AutoLisp 扩展,从而可以使用 VS Code 编辑和调试 AutoLisp 程序。
  • 为 AutoLisp 提供了 Unicode 支持。

这里,第二个新功能为从前编写的 AutoLisp 程序带来了一定的问题。

主要问题

首先我们来测试一句代码:

1
(substr "I am chinese." 3 4)

在 AutoCAD 任一版本中,返回的结果都是 am csubstr 函数的第二个字符串参数是被截取的字符串,第三个参数表示字符起始位置,第四个参数表示字符长度。在西文中,一个字符均采用一个字节来表达,这条语句的返回值为 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 值为 12 时,上述代码的返回值为 一个中国

BRTools 的解决办法

BRTools 编写的命令中,有相当的字符串处理工作,其中很多会涉及到中文字符串的处理,对这个问题可以有两类解决办法。

短期的解决办法

短期内的解决办法是在使用 AutoCAD 2021 时将 LISPSYS 设置为 0,不去更改源代码的内容,目前推荐用户先采用这种方法救急。

长期解决办法

更改支持 Unicode 的 Lisp 代码

这个工作首先需要找出所有涉及字符串操作的函数,编写对应不同编码方案的两种函数,通过 AutoCAD 的版本来判断需要使用的函数,这个工作好像是个坑,暂时没有工夫去填了,虽然这个坑值得填。

感谢拨冗阅读本文,若有些许收获,不妨捐赠以资鼓励。