Autocad/ BricsCAD 的 autolisp 支援了 UTF-8

奇怪的返回值

最近朋友問了一個問題,現在出的 Autocad 使用了 autolisp 的 strlen 函數時,計算中文字數返回的數值怪怪的,怎麼 (strlen "中文") 會返回 2 而不是 4?理論上來說,它是沒有錯,"中文"二字應該是要返回 2 。但是,在以前 autolisp 使用 strlen 計算包含中文字的字元數,是一個中文字等於二個字元。用久了反而在 Autocad 修正(修改)後,造成了一些困擾。由於朋友的客戶開發了很多包含了 (strlen ...) 的程式,如果要一個一個去校正那些程式,讓它執行時像以前那樣,可能要花費很多的時間。這個問題多數在程式對於字碼的轉換上出現,只是 Autocad 的 autolisp 終於也遇上了,雖然大家等了幾十年。

同病相連的伙伴

在 BricsCAD 上它也遇到了相同的問題,因為它一開始就支援了 UTF-8。所以它支援的 autolisp 也是一開始就是 (strlen "中文") => 2 。那為什麼這個 Autocad 的特性竟造成 BricsCAD 的問題呢?因為 BricsCAD 想要贏得 Autocad 客戶的青睞。在這個時期 (2023) ,可以想像這 BricsCAD 不搶 Autocad 的客戶,好像說不過去?如果能夠解決這個中文字元計算數值的問題,這下子不就可以解決 Autocad 和 BricsCAD 選擇方面的自由。朋友表示不能認同 Autocad 原廠停止賣斷及只給使用期租賃的決定,但是除了 BricsCAD 之外其他的 CAD 軟體不給力,那他就失去的選擇的權力。因為新版的 Autocad 不支援,朋友客戶使用的程式只能慢慢的凋零了。

為什麼以前 autolisp  的 (strlen "中文") 返回 4

最直接的想法是, Windows 中控台 (console) 只有支援 ASCII ,而 Windows 繁體中文版等主要作業系統的字元集都是以 Big5 碼為基準。其中 Big5 碼是雙位元組字元集,使用雙八碼儲存方法,以兩位元組安放一字。第一位元組稱為「高位位元組」,第二位元組稱為「低位位元組」。所以在使用 autolisp (strlen "中文")才會返回 4 。而在新版的 Autocad/ BricsCAD 宣告了它們支援了 UTF-8 後,就把字元數統一成一個字一字元。

解決燃眉之急

那朋友的客戶舊有的程式要怎麼處理?我們這給了一個建議,假設其程式沒有其他國家使用的的字碼,單純只需要支援英文數字符號及中文字的字元數計算,以配合舊有的程式。我們寫了一個小程式以代替 (strlen ...) ,名字稱為 (cs-to-strlen ...) 其原始碼在此。雖然有一個小工具可以暫時解決這個字碼轉換時期,但是統一使用 UTF-8 字碼也算時時代的進步了。用於工作上的程式還是要好好的維護它才是。

各申機械設計工作室; Each Application Mechanical Design Studio 

聯絡方式 

相關資炓

壓力容器設計 各申機械設計工作室


留言