AutoLISP 青黃交接:AutoCAD 2020 前後 Unicode 相容問題與解法

 AutoLISP 新舊版本交接問題

在 AutoCAD 2020 之後,AutoLISP 開始支援 Unicode 字碼。  
這使得舊版僅支援 ASCII(MBCS)的 AutoCAD 在執行新撰寫的 LISP 程式時,  
容易出現中文亂碼或程式無法執行的問題。

本文整理 AutoLISP 在新舊版本間的字碼差異、`(strlen ...)` 函數行為改變的影響,  
以及實務上可行的解決方式。

新版 AutoLISP 程式交給舊版 AutoCAD 執行的問題

AutoLISP 是 AutoCAD 長期支援的開發程式。

以前寫過的程式通常可以拿到新版 AutoCAD 上執行;  
相對地,把現在寫的程式交給之前的版本執行也可能運作,但容易出問題。

AutoCAD 2020 以前:

- AutoLISP 只支援 ASCII(MBCS)  
- 現代文字編輯器或 VS Code 預設 Unicode 編碼 → 舊版執行時會亂碼  

AutoCAD 2020 之後:

- 支援 Unicode → 中文與特殊字元皆正常

舊版 AutoLISP 程式在 Unicode 環境下的 strlen 行為改變


在 Unicode 支援後,`(strlen ...)` 計算字數時:
- 過去:每個中文字 2 字節  
- 現在:每個中文字 1 字節  

這會造成使用 `(strlen ...)` 的舊程式獲得不同結果,可能影響程式邏輯。 

AutoLISP 中文亂碼的實務解法

方法 1:指定字碼

  • 設定 `lispsys` 系統變數為 ASCII (MBCS) 
  • 儲存 LSP 檔時使用 ASCII 字元集

方法 2:使用支援 Unicode 的 AutoCAD 版本

方法 3:將 LSP 檔案以 Big5 編碼使用於舊版 AutoCAD

```lisp
;;;; -*- encoding:big5 -*-

如何解決 strlen 數字數的問題

可以借用 《Autocad/ BricsCAD 的 autolisp 支援了 UTF-8》中提到的 (cs-to-strlen ...)來處理舊的程式,以適應新的變化。

備註

在實務應用中,不同版本 AutoCAD 對 AutoLISP 字碼支援不同,
所以在撰寫或維護程式時應考慮:

  • 舊版 ASCII 環境下中文亂碼

  • (strlen ...) 計算字數差異

  • 編碼與 AutoCAD 版本相容性

 

 


 

留言

這個網誌中的熱門文章

壓力容器設計:最低設計金屬溫度 (MDMT)

壓寶計劃:如何設計桶槽的容積刻度尺/ How to design the volume scale of the barrel tank

計算碟形端板的內容積/calculate internal volume of spherically dished