由 wctang » 週一 5月 26, 2003 5:02 pm
大致上沒錯,我用一些程式來說明,不知道會不會比較清楚…
windows2000 下的文字顯示。
windows 2000
在 windows 中在和字串相關的 win32 api 都有兩個版本,例如 SetWindowText 是設定視窗
標題的文字。
BOOL SetWindowText(
HWND hWnd,
LPCTSTR lpString
);
不過其實 SetWindowText 只是個 macro,真正的函式定義有兩個,一個是
ANSI 版,另一個是 Unicode 版,實際上用哪個是在 compile 時就決定了,看 compile 時的
設定。
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
看看原本的 SetWindowText 原型, LPCTSTR 也是用類似的定義。如果有定義 UNICODE 的話,
就是個 unicode(utf16) 的字串,不然的話就代表一般的 ansistring。
雖然在使用者寫程式時有兩種選擇,可是系統內部其實只有一套,就是 unicode 的那一套。
至於在 ansi 字串時,其實就只是先轉成 unicode 再在內部呼叫 unicode 的那一套。
那要怎麼從 ansi 轉成 unicode,是以使用者一個設定值。在
control->regional->Advanced->Language for non-Unicode programs,可以試試,換一下。
如原本是 PRC 換成 taiwan,原本是 taiwan 換成 PRC,你打開文字檔就可以看到一堆亂碼了。
可是就算你設錯了,原本內部就是以 unicode 設計的程式是不受影響的,因為我的是英文版的,
所以看不出來,不過大概 office 就不會受到影響吧。
當然,如果你本來就道讀進來的字串是什麼編碼的話,windows 也提供轉碼的方法。所以如果你
知道人家從網路上傳給你的一段文字是 jis 編碼,只要在程式中先轉成 utf16 ,再用 unicode
輸出,不管使用者的 locale 設定如何都可以正確的顯示,而如何知道一段文字的編碼,就由
mime 等標準來得知吧。如果只是純文字檔的話呢? 其實還是有辦法的,是用 BOM 來做,不過就只能判斷是不是 UNICODE, 像繁簡體就沒輒了。我在想,當 linux 上的 utf-8 已經很完善的話,我的文件就都要用 unicode 的形式來做了,這樣的問題應該會少得多了吧…
所以,如果你的程式是以unicode 來做輸出的話,不論 user 的 locale 的設定如何,也都可以
正確顯示的。而且 windows 的字型是系統來管理,在內部是以 unicode 的方式來對應,所以通
常也不會出現問題。
另一方面是訊息會不會依使用者設定的 locale 來自動轉換文字顯示,這點我的印象是由 resource
來做到,不過在 windows 少有程式做到這點。
結論是, windows 的顯示功能是以 unicode 為基礎。而這點在 linux 上大概要把 locale 的 encoding
設定成 utf-8 才能有同樣的效果吧。
不知道這樣說明會不會比較清楚?
至於 linux 上的方法,網路上也蠻多人有說明,看看有沒有人可以介紹一下…