Unicode 和多字节字符集 (MBCS) 支持

某些语言(例如日语和中文)具有大型字符集。 为了为这些市场提供编程支持,Microsoft 基础类库 (MFC) 支持两种不同的大型字符集处理方法:

  • Unicode,基于 wchar_t 的宽字符和编码为 UTF-16 的字符串。

  • 多字节字符集 (MBCS),以特定于区域设置的字符集编码的基于 char 的单字节或双字节字符和字符串。

注意

Microsoft 建议使用 MFC Unicode 库进行所有新开发。
Visual Studio 2013 和 Visual Studio 2015 已弃用 MBCS 库。 这种情况不会再出现。
从 Visual Studio 2017 开始,MBCS 库不再弃用,不会生成弃用警告。

MFC 对 Unicode 字符串的支持

整个 MFC 类库有条件地支持以 UTF-16 宽字符方式存储的 Unicode 字符和字符串。 尤其是,类 CString 支持 Unicode。

以下库、调试器和 DLL 文件用于在 MFC 中支持 Unicode:

MFCversionU.LIB
MFCversionUD.LIB
MFCMversionU.LIB
MFCMversionUD.LIB
MFCSversionU.LIB
MFCSversionUD.LIB
UAFXCW.LIB
UAFXCWD.LIB

MFCversionU.PDB
MFCversionUD.PDB
MFCMversionU.PDB
MFCMversionUD.PDB
MFCSversionU.PDB
MFCSversionUD.PDB
UAFXCW.PDB
UAFXCWD.PDB

MFCversionU.DLL
MFCversionUD.DLL
MFCMversionU.DLL
MFCMversionUD.DLL

version 表示文件的版本号;例如,“140”表示版本 14.0。)

CString 基于 TCHAR 数据类型。 如果为程序的生成定义了符号 _UNICODE,则会将 TCHAR 定义为类型 wchar_t,即 16 位字符编码类型。 否则,会将 TCHAR 定义为 char,即普通的 8 位字符编码。 因此,在 Unicode 下,一个 CString 由 16 位字符组成。 如果没有 Unicode,它将由类型 char 的字符组成。

若要完成 Unicode 的应用程序编程,还必须:

  • 使用 _T 宏对文本字符串进行有条件地编码,使其可移植到 Unicode。

  • 传递字符串时,请注意函数参数的长度是需要以字符为单位还是以字节为单位。 如果使用 Unicode 字符串,这种差别至关重要。

  • 使用可移植版本的 C 运行时字符串处理函数。

  • 对字符和字符指针使用以下数据类型:

    • 需要使用 char 时使用 TCHAR

    • 需要使用 char* 时使用 LPTSTR

    • 需要使用 const char* 时使用 LPCTSTRCString 提供运算符 LPCTSTR 以在 CStringLPCTSTR 之间转换。

CString 还提供可识别 Unicode 的构造函数、赋值运算符和比较运算符。

运行时库参考定义其所有字符串处理函数的可移植版本。 有关详细信息,请参阅国际化类别。

MFC 对 MBCS 字符串的支持

类库还支持多字节字符集,但仅支持双字节字符集 (DBCS)。

在多字节字符集中,字符宽度可以是一个或 2 个字节。 如果它的宽度是 2 个字节,则第一个字节是从特定范围选择的特殊“前导字节”,具体取决于正在使用的代码页。 此前导字节和“尾随字节”一起指定唯一字符编码。

如果为程序的生成定义了符号 _MBCS,则 TCHAR 类型(CString 所基于的类型)将映射到 char。 你需要确定 CString 中哪些字节是前导字节,哪些是尾随字节。 C 运行时库提供的函数有助于确定这一点。

在 DBCS 下,给定字符串可以包含所有单字节 ANSI 字符、所有双字节字符或两者的组合。 在分析字符串时,需要特别注意这些可能的情况。 这包括 CString 对象。

注意

无论正在运行的应用程序版本如何,MFC 中的 Unicode 字符串序列化都可以同时读取 Unicode 和 MBCS 字符串。 数据文件在程序的 Unicode 和 MBCS 版本之间可移植。

CString 成员函数使用它们调用的特殊“泛型文本”版本的 C 运行时函数,或使用可识别 Unicode 的函数。 因此,例如,如果 CString 函数通常会调用 strcmp,它将改为调用相应的泛型文本函数 _tcscmp。 根据符号 _MBCS_UNICODE 的定义方式,_tcscmp 按如下所示映射:

符号 函数
_MBCS 已定义 _mbscmp
_UNICODE 已定义 wcscmp
两个符号均未定义 strcmp

注意

符号 _MBCS_UNICODE 是互斥的。

C 运行时库参考中讨论了所有运行时字符串处理例程的泛型文本函数映射。 有关列表,请参阅国际化

同样,CString 方法也是通过使用泛型数据类型映射来实现的。 要同时支持 MBCS 和 Unicode,MFC 对 charwchar_t 使用 TCHAR,对 char*wchar_t* 使用 LPTSTR,对 const char*const wchar_t* 使用 LPCTSTR。 这些可以确保对 MBCS 或 Unicode 使用正确的映射。

另请参阅

字符串 (ATL-MFC)
字符串操作