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 將無法運作( strCString ):

    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,包括 CStringCString 也提供 Unicode/ANSI 轉換函式。

  • 執行時間程式庫提供所有字串處理函式的 Unicode 版本。 (執行時間程式庫也提供適用于 Unicode 或 MBCS 的可攜式版本。這些是 _tcs 宏。

  • tchar.h 提供可攜式資料類型和 _T 宏來翻譯常值字串和字元。 如需詳細資訊,請參閱 tchar.h 中的泛型文字對應。

  • 執行時間程式庫提供 寬字元版本的 main 。 用來 wmain 讓應用程式感知 Unicode。

另請參閱

Unicode 的支援