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。