Unicode 程式設計摘要
若要利用 Unicode 的 MFC 和 C 執行時間支援,您需要:
定義
_UNICODE
。在建置程式之前定義符號
_UNICODE
。指定進入點。
在 專案 [屬性頁 ] 對話方塊中 [連結器 ] 資料夾的 [進階 ] 頁面上 ,將 進入點 符號設定為
wWinMainCRTStartup
。使用可攜式執行時間函式和類型。
使用適當的 C 執行時間函式來處理 Unicode 字串。 您可以使用函
wcs
式系列,但您可能偏好完全可攜式(已啟用國際)_TCHAR
的宏。 這些宏都前面_tcs
加上 ,它們會以函式系列取代一個為一str
個。 這些函式會在執行時間程式庫參考 的 國際化 一節中 詳細說明。 如需詳細資訊,請參閱 tchar.h 中的泛型文字對應。使用
_TCHAR
和支援 Unicode 中所述 的相關可攜式資料類型。正確處理常值字串。
Visual C++ 編譯器會將編碼為的常值字串解譯為:
L"this is a literal string"
表示 Unicode 字元的字串。 您可以針對常值字元使用相同的前置詞。
_T
使用 宏以一般方式撰寫常值字串的程式碼,因此它們會在 Unicode 下編譯為 Unicode 字串或 ANSI 字串(包括 MBCS),而不使用 Unicode。 例如,不要這樣撰寫:pWnd->SetWindowText( "Hello" );
使用:
pWnd->SetWindowText( _T("Hello") );
若
_UNICODE
已定義,_T
會將常值字串轉譯為 L 前置詞格式,否則會_T
轉譯不含 L 前置詞的字串。提示
宏
_T
與_TEXT
宏相同。請小心將字串長度傳遞至函式。
某些函式想要字串中的字元數;其他則想要位元組數目。 例如,如果
_UNICODE
已定義,對 物件的下列呼叫CArchive
將無法運作(str
為CString
):archive.Write( str, str.GetLength( ) ); // invalid
在 Unicode 應用程式中,長度會提供字元數,但無法提供正確的位元組數目,因為每個字元寬 2 個位元組。 相反地,您必須使用:
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
,指定要寫入的正確位元組數目。
不過,以字元為導向的 MFC 成員函式,而不是位元組導向,不需要撰寫額外的程式碼即可運作:
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut
會採用數個字元,而不是位元組數目。使用 fopen_s,_wfopen_s 開啟 Unicode 檔案。
為了摘要說明,MFC 和執行時間程式庫提供下列 Unicode 程式設計支援:
除了資料庫類別成員函式之外,所有 MFC 函式都已啟用 Unicode,包括
CString
。CString
也提供 Unicode/ANSI 轉換函式。執行時間程式庫提供所有字串處理函式的 Unicode 版本。 (執行時間程式庫也提供適用于 Unicode 或 MBCS 的可攜式版本。這些是
_tcs
宏。tchar.h 提供可攜式資料類型和
_T
宏來翻譯常值字串和字元。 如需詳細資訊,請參閱 tchar.h 中的泛型文字對應。執行時間程式庫提供 寬字元版本的
main
。 用來wmain
讓應用程式感知 Unicode。