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

 from:http://msdn.microsoft.com/zh-cn/library/cc468203(v=vs.71).aspx

有些国际市场以大字符集来使用日文和中文等语言。为了支持这些市场的编程,Microsoft 基础类库 (MFC) 支持以两种方式处理大字符集:

Unicode 字符串的 MFC 支持

整个类库有条件地支持 Unicode 字符和字符串。特别是 CString 类也支持 Unicode。

注意      MFC 库的 Unicode 版本不会复制到硬盘上,除非您在“自定义”安装时选择它们。在其他类型的安装过程中不会复制它们。如果试图在没有 MFC Unicode 文件的情况下生成或运行 MFC Unicode 应用程序,可能会出现错误。
要将这些文件复制到硬盘上,请重新运行安装程序并单击“添加/移除功能”。单击“语言工具”,单击“Visual C++”并单击“Visual C++ 类和模板库”,然后选择“ATL MFC 共享库 Unicode”和“ATL MFC 静态库 Unicode”。这会将以下文件复制到硬盘上:
UAFXCW.LIBUAFXCW.PDBUAFXCWD.LIBUAFXCWD.PDB
MFCxxU.LIBMFCxxU.DBGMFCxxU.DLLMFCxxUD.LIB
MFCxxUD.PDBMFCxxUD.DLLMFCDxxUD.LIBMFCDxxUD.PDB
MFCDxxUD.DLLMFCNxxUD.LIBMFCNxxUD.PDBMFCNxxUD.DLL
MFCOxxUD.LIBMFCOxxUD.PDBMFCOxxUD.DLL 

其中“xx”表示文件的版本号,例如“70”表示 7.0 版本。

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

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

  • 使用 _T 宏有条件地编写字符串的代码,使之可移植到 Unicode。
  • 当传递字符串时,请注意函数参数要求的长度是以字符为单位还是以字节为单位的。如果在使用 Unicode 字符串,这一区别是很重要的。
  • 使用 C 运行时字符串处理函数的可移植版本。
  • 使用以下用于字符和字符指针的数据类型:
    • TCHAR   这里将使用 char
    • LPTSTR   这里将使用 char*
    • LPCTSTR   这里将使用 const char*CString 提供 operator LPCTSTR 来在 CStringLPCTSTR 之间进行转换。

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

    有关 Unicode 编程的相关信息,请参见 Unicode 和 MBCS Unicode 主题。《运行时库参考》中定义了所有字符串处理函数的可移植版本。请参见类别国际化

    MBCS 字符串的 MFC 支持

    类库还支持多字节字符集,特别是双字节字符集 (DBCS)。

    在这一方案下,字符的宽度可以是一个字节,也可是两个字节。如果字符的宽度是两个字节,那么它的第一个字节就是一个特殊的“前导字节”,该字节是根据所使用的代码页从某个特定范围选定的。前导字节和“尾字节”合起来指定一个唯一的字符编码。

    如果为程序的生成定义了符号 _MBCS,则类型 TCHARCString 基于该类型)将映射到 char。由您来决定 CString 中的哪些字节是前导字节,哪些字节是尾字节。C 运行时库提供函数来帮助您进行确定。

    在 DBCS 下,给定的字符串可以包含所有的单字节 ANSI 字符、所有的双字节字符或两者的组合。这些可能性需要您在分析字符串(包括 CString 对象)时要备加小心。

    注意      MFC 中的 Unicode 字符串序列化能够读取 Unicode 和 MBCS 字符串,而不论运行的是哪个版本的应用程序。正因为如此,数据文件在程序的 Unicode 和 MBCS 版本之间是可移植的。

    CString 成员函数使用其调用的 C 运行时库特殊的“一般文本”版本,或使用识别 Unicode 的函数,如 lstrlenlstrcpy。因此,如果 CString 函数通常情况下调用 strcmp,那么它会调用相应的一般文本函数 _tcscmp。根据符号 _MBCS_UNICODE 定义方式的不同,_tcscmp 映射如下:

    _MBCS 已定义_mbscmp
    _UNICODE 已定义wcscmp
    两者都未定义strcmp
    注意      符号 _MBCS _UNICODE 是互相排斥的。

    《运行时库参考》中对所有运行时字符串处理例程的一般文本函数映射作了详细的介绍。请参见类别国际化

    同样地,CString 成员函数是使用“一般”数据类型映射来实现的。要启用 MBCS 和 Unicode,MFC 使用 TCHAR 映射 char、LPTSTR 映射 char* 并使用 LPCTSTR 映射 const char*。这会得到 MBCS 或 Unicode 的正确映射。

    请参见

    字符


    • 1
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    要使用多字节字符集 (MBCS) 或者 Unicode 字符集来进行转换,你可以使用一些 C++ 标准库提供的函数来实现。 如果你想将一个窄字符字符串 (char *) 转换为宽字符字符串 (LPCWSTR),你可以使用 MultiByteToWideChar 函数。以下是一个示例代码: ```cpp #include <windows.h> #include <iostream> int main() { const char* narrowStr = "Hello, World!"; // 窄字符字符串 int wideStrLength = MultiByteToWideChar(CP_UTF8, 0, narrowStr, -1, NULL, 0); // 获取宽字符字符串的长度 wchar_t* wideStr = new wchar_t[wideStrLength]; // 分配内存来存储宽字符字符串 MultiByteToWideChar(CP_UTF8, 0, narrowStr, -1, wideStr, wideStrLength); // 执行转换 // 打印宽字符字符串 std::wcout << wideStr << std::endl; delete[] wideStr; // 释放内存 return 0; } ``` 如果你想将一个宽字符字符串 (LPCWSTR) 转换为窄字符字符串 (char *),你可以使用 WideCharToMultiByte 函数。以下是一个示例代码: ```cpp #include <windows.h> #include <iostream> int main() { LPCWSTR wideStr = L"Hello, World!"; // 宽字符字符串 int narrowStrLength = WideCharToMultiByte(CP_UTF8, 0, wideStr, -1, NULL, 0, NULL, NULL); // 获取窄字符字符串的长度 char* narrowStr = new char[narrowStrLength]; // 分配内存来存储窄字符字符串 WideCharToMultiByte(CP_UTF8, 0, wideStr, -1, narrowStr, narrowStrLength, NULL, NULL); // 执行转换 // 打印窄字符字符串 std::cout << narrowStr << std::endl; delete[] narrowStr; // 释放内存 return 0; } ``` 这些示例代码演示了如何使用 Windows API 函数来进行字符串的转换。请确保在使用这些函数之前,包含了 `<windows.h>` 头文件。 希望这能帮助你进行字符集转换!如果你有任何进一步的问题,请随时提问。

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值