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

4 comments:

ericsk said...

關於 (1) 我覺得不用想那麼多耶,因為在 VS 的 IDE 裡存檔應該就是存成 ISO-8859-1 或 Big5 這些 charset ,而用 printf 輸出到 windows 的 console (也就是 cmd)下,剛好它也是 Big5 ,所以 printf 乖乖把 bytes 印出來時,在 console 上看起來當然很正常。

我覺得,這就是在一連串故意下的巧合 XD

Royce Lu said...

我同意你的看法。
應該是跟VS IDE的存檔有關係
因為我有對簡體字做實驗
在我的IDE下面會變成亂碼

所以說不定WinXP換成其他語言
或是IDE用其他語言的版本
printf就不能印出中文了

還是用一種廣為接受的編碼,譬如Unicode,
這樣會比較妥當。

okk said...

小路兒~我用google再找unicode之類的文章..竟然就連到你的blog了...一切真是太神奇了..神奇的小路兒~

強者果然不一樣..我在努力研究一下...哈哈

Royce Lu said...

呵呵,好棒:)
只是做點小筆記,希望能對妳有幫助摟。