0175期:Delphi 處理 Unicode 的問題

作者:CGS •  日期:2006/07/26  •  類別: 程式漫談 ;•Friendly Print ;•

  

有寫過 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期:萬碼奔騰的中文世界

« 上一篇文章下一篇文章 »

Add this page to MyShare  Add this page to Hemidemi  Add this page to Yahoo  Add this page to FunP  Add this page to udn  收藏到Fiigo書籤  加入此網頁到 YouPush  Diigo it  Add this page to del.icio.us
引用
程式設計人手札
0296期:Unicode 全字集字型:Arial Unicode MS: 我在 0175期:Delphi 處理 Unicode 的問題,曾經談過用 TextOutW 來處理 Unicode 字集的問題。 原本以為這樣的解決方案,大致上沒有問題,後來發現我遺漏了一個問題,Windows 下的字型都有其對應的字集,我當初選的字型是...
2009/06/22
使用 引用文章網址l 來通知本網站關於您的引用文章(按右鍵,複製捷徑).
引用本站文章需經過人工審核 ,所以如果你的引用沒有馬上出現 ,請稍待站長處理 .
如果你的部落格不支援引用 ,你可利用 此視窗手動加入你的引用.

留言

作者: tnsypos  •  2006/08/20  •  08:29:40

作者您好. 經由您的介紹, 使用了 TnTWare Unicode 在 Delphi 上來支援 UniCode.
但有個問題請教您....

就是, 為何在使用 DBControl 對數據庫操作時,
打出是完整的字, 但一 exit , 就又成 ? 字了.
是否那裡還需設定嗎?

tnsypos[at]gmail[dot]com

作者: bwhu  •  2006/09/20  •  11:00:51

I think the most possible answer is that the database doesnn't support the UNICODE.

留下你的意見