Friday, February 9, 2007
Unicode使用123(續)
因為上官大大的發問,我一時好奇就做了幾個實驗。
因為想說的有點多,所以另外開一篇文章。
關於使用"Unicode"中文,就用_T("這是中文")。
下面是我的實驗心得
(under Windows XP SP2, Visual Stdio 2005)
1.使用printf
這是一個很詭異的function
如果把string轉換成multibyte,printf不能正常印出
但是!!如果直接餵中文給他吃,卻可以正常的印出。
推測是因為呢 _T把bit order給重排了
而printf裡面的運作是以char為單位
所以呢...造成了這樣的現象
如果說用命令列引數傳給printf印也是正常印出
我懷疑在這過程中我給的中文引數被動了手腳...
恩恩 以上純屬推測XD
2.關於wprintf
原來C裡面的multibyte不一定是Unicode,有可能是任何的編碼方式
如果直接餵他吃multibyte的中文...也是不行印出來
但是如果先呼叫setlocale(LC_ALL,"chs");
就可以讓wprintf知道要印出來的是中文,就可以了。
MSDN上面關於setlocale的資訊:Use the setlocale function to set, change, or query some or all of the current program locale information specified by locale and category.
3.關於_tprintf
printf與wprintf的組合
4.關於WriteConsole
Windows NT之後使用的是Unicode編碼
其API也對Unicode有良好支援
如果要輸出純Unicode String
這裡是一個例子
TCHAR CHString[100] = _T("這是中文!\n");
DWORD ws;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),
CHString,
wcslen(CHString),
&ws,
NULL);
如果有define unicode的話,就會呼叫WriteConsoleW,不然的話就會呼叫WriteConsoleA
來處理ASCII。
5.心得
C lib支援multibyte的編碼,但不一定是Unicode。
使用setlocale(LC_ALL,"chs");設定編碼方式
可以讓multibyte的C function印出中文
也就是說要寫general的程式 _tprintf可以辦的到
但是要先setlocale
但是!
如果需要完整Unicode的支援,最好使用Windows所提供的API。
而且Windows API大都實做成general的方式
會看處理的字串是Unicode或是ASCII作對應的轉換
所以guidline要加上一條...Windows底下請愛用Windows API
如果很在意可攜性,那麼進一步研究C lib 的multibyte是必要的...
(在下目前是Windows guy 既然NT與CE都support Unicode...就讓我偷懶一下吧:P )
reference:
http://blog.vckbase.com/bruceteen/archive/2005/11/15/14924.aspx
http://www.cppblog.com/sandy/archive/2006/06/21/8779.html
http://blog.csdn.net/imwkj/archive/2007/01/23/1490647.aspx
Labels:
Programming
Subscribe to:
Post Comments (Atom)
4 comments:
關於 (1) 我覺得不用想那麼多耶,因為在 VS 的 IDE 裡存檔應該就是存成 ISO-8859-1 或 Big5 這些 charset ,而用 printf 輸出到 windows 的 console (也就是 cmd)下,剛好它也是 Big5 ,所以 printf 乖乖把 bytes 印出來時,在 console 上看起來當然很正常。
我覺得,這就是在一連串故意下的巧合 XD
我同意你的看法。
應該是跟VS IDE的存檔有關係
因為我有對簡體字做實驗
在我的IDE下面會變成亂碼
所以說不定WinXP換成其他語言
或是IDE用其他語言的版本
printf就不能印出中文了
還是用一種廣為接受的編碼,譬如Unicode,
這樣會比較妥當。
小路兒~我用google再找unicode之類的文章..竟然就連到你的blog了...一切真是太神奇了..神奇的小路兒~
強者果然不一樣..我在努力研究一下...哈哈
呵呵,好棒:)
只是做點小筆記,希望能對妳有幫助摟。
Post a Comment