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 版本相容性
留言
張貼留言