0175期:Delphi 處理 Unicode 的問題
有寫過 Delphi for Win32 程式的程式設計師,應該知道整個 VCL for Win32的設計基本上是基於 ANSI ( 如果在台灣 ,等於 BIG-5編碼) 編碼的,並不直接支援 Unicode,但是隨著程式設計環境慢慢的演變,網路上的網頁程式有越來越走向支援 Unicode標準的趨勢。
但是當遇到網頁即使已選擇以 BIG-5解釋編碼上,客戶輸入的中文字 (如地址或姓名不在 BIG-5編碼支援) ,瀏覽器 (這點是我的猜測,如果猜錯請指正) 會特別針對無法轉換的字元改為 & # 數字 ; 數字的部份就是 Unicode 編碼。
最明顯的例子 ,如前行政院長游錫?的?字,就不是 BIG-5編碼內支援的字,當 Delphi 重新讀到資料庫內有存這種字元時,並不會做任何改變,於是列印出來就成了亂碼,但是當網頁程式如 JSP、 ASP、 PHP讀取資料庫,透過瀏覽器的轉譯,即使在 BIG-5編碼的網頁,顯示卻正常。
但是即使你在讀取資料庫時,特別寫一個函式來轉換這些字元成為 WideString ,再設定
值給原始的 VCL for Win32元件,你會發覺這些 Unicode字集自動全部都變成 ?了,因為這些值在 VCL都是以 BIG-5編碼存檔,Delphi呼叫系統轉換 Unicode到 BIG-5時,無法對應的字元就變成了 ?。
如果不想大改系統,可以選擇安裝 Unicode補完計劃 (BIG5-UAO),裝這套系統的好處是,他修改了 Unicode與 ANSI(BIG-5)轉碼的底層,很多不支援的字在這個環境下都存在,缺點是每個想看這種編碼的人都得安裝一次 UAO,目前的微軟視窗作業系統並不直接支援 UAO或另一個類似的競爭標準 BIG5-2003。
不過很多人可能都不願意看到使用者得另裝一個編碼元件,那有什麼其他的選擇呢?在 VCL部份,由於可以自行撰寫元件,於是就有支援 Unicode編碼的元件 TntWare Delphi Unicode Controls 的出現,透過直接支援 Unicode,可以將Unicode 字元直接顯示在畫面上。
那報表怎麼辦,一般人可能會採用如FastReport或 QuickReport的報表產生工具,這些報表工具的新版都開始慢慢支援 Unicode編碼了,萬一公司採用的還是舊版的報表工具,一個方法就是買新版吧,雖然前後版本可能會有一點陣痛期,另一個方法就是透過圖形轉換的方式,這些報表工具都有提供印出圖形的功能,透過 Delphi 呼叫系統的 TextOutW 來印出文字於圖形上,再請報表工具印出就好了,這個方法我自己試過,不論 FastReport或 QuickReport都可藉由這種方式印出 Unicode字元。
我想這種 BIG-5與 Unicode之間的問題,應該也是會一直發展下去,如果到了 .NET 環境,系統就跟 Java 環境一樣,內部採用 Unicode編碼系統,這個問題會減少一點,集中在系統匯入和匯出資料時。程式設計的慢慢演變,常常減少了一些問題,但也會發生一些新問題,中文編碼也不例外不是嗎。
延伸閱讀 0149期:網頁中文化的選擇,從 BIG-5 走向 UTF-8
延伸閱讀 0081期:萬碼奔騰的中文世界
但是當遇到網頁即使已選擇以 BIG-5解釋編碼上,客戶輸入的中文字 (如地址或姓名不在 BIG-5編碼支援) ,瀏覽器 (這點是我的猜測,如果猜錯請指正) 會特別針對無法轉換的字元改為 & # 數字 ; 數字的部份就是 Unicode 編碼。
最明顯的例子 ,如前行政院長游錫?的?字,就不是 BIG-5編碼內支援的字,當 Delphi 重新讀到資料庫內有存這種字元時,並不會做任何改變,於是列印出來就成了亂碼,但是當網頁程式如 JSP、 ASP、 PHP讀取資料庫,透過瀏覽器的轉譯,即使在 BIG-5編碼的網頁,顯示卻正常。
但是即使你在讀取資料庫時,特別寫一個函式來轉換這些字元成為 WideString ,再設定
值給原始的 VCL for Win32元件,你會發覺這些 Unicode字集自動全部都變成 ?了,因為這些值在 VCL都是以 BIG-5編碼存檔,Delphi呼叫系統轉換 Unicode到 BIG-5時,無法對應的字元就變成了 ?。
如果不想大改系統,可以選擇安裝 Unicode補完計劃 (BIG5-UAO),裝這套系統的好處是,他修改了 Unicode與 ANSI(BIG-5)轉碼的底層,很多不支援的字在這個環境下都存在,缺點是每個想看這種編碼的人都得安裝一次 UAO,目前的微軟視窗作業系統並不直接支援 UAO或另一個類似的競爭標準 BIG5-2003。
不過很多人可能都不願意看到使用者得另裝一個編碼元件,那有什麼其他的選擇呢?在 VCL部份,由於可以自行撰寫元件,於是就有支援 Unicode編碼的元件 TntWare Delphi Unicode Controls 的出現,透過直接支援 Unicode,可以將Unicode 字元直接顯示在畫面上。
那報表怎麼辦,一般人可能會採用如FastReport或 QuickReport的報表產生工具,這些報表工具的新版都開始慢慢支援 Unicode編碼了,萬一公司採用的還是舊版的報表工具,一個方法就是買新版吧,雖然前後版本可能會有一點陣痛期,另一個方法就是透過圖形轉換的方式,這些報表工具都有提供印出圖形的功能,透過 Delphi 呼叫系統的 TextOutW 來印出文字於圖形上,再請報表工具印出就好了,這個方法我自己試過,不論 FastReport或 QuickReport都可藉由這種方式印出 Unicode字元。
我想這種 BIG-5與 Unicode之間的問題,應該也是會一直發展下去,如果到了 .NET 環境,系統就跟 Java 環境一樣,內部採用 Unicode編碼系統,這個問題會減少一點,集中在系統匯入和匯出資料時。程式設計的慢慢演變,常常減少了一些問題,但也會發生一些新問題,中文編碼也不例外不是嗎。
延伸閱讀 0149期:網頁中文化的選擇,從 BIG-5 走向 UTF-8
延伸閱讀 0081期:萬碼奔騰的中文世界
















