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 字符串或在没有 Unicode 的情况下编译为 ANSI 字符串(包括 MBCS)。 例如,不是:

    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