使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?



过去,我使用CT2WCT2A在Unicode和Ansi之间转换字符串。现在看来,CStringWCStringA也可以做同样的任务。

我编写以下代码片段:

CString str = _T("Abc");
CStringW str1;
CStringA str2;
CT2W str3(str);
CT2A str4(str);
str1 = str;
str2 = str;

这似乎CStringW,当我为它们分配str时,CStringA也会使用WideCharToMultibyte来执行转换。

那么,使用CT2W/CT2A而不是CStringW/CStringA有什么好处,因为我从未听说过后一对。MS都不建议后一对进行转换。

CString提供了许多转换构造函数,用于在ANSI和Unicode编码之间进行转换。它们既方便又危险,通常掩盖错误。MFC 允许您通过定义_CSTRING_DISABLE_NARROW_WIDE_CONVERSION预处理器符号(您可能应该这样做(来禁用隐式转换。转换始终涉及使用堆分配的存储创建新的CString对象(忽略短字符串优化(。

相比之下,Cs2d宏(其中s= 源,d= 目标(处理原始 C 样式字符串;在字符编码之间转换的过程中不会创建CString实例。除了堆分配的缓冲区外,堆栈上始终分配一个包含 128 个代码单元的临时缓冲区,以防转换需要更多空间。

上述两种方法都使用隐含的 ANSI 代码页(如果定义了_CONVERSION_DONT_USE_THREAD_LOCALE预处理器符号,则为CP_THREAD_ACPCP_ACP(执行转换。CP_ACP特别麻烦,因为它是进程全局设置,任何线程都可以随时更改。

您应该为转化选择哪一个?以上都不是。请改用EX版本(有关完整列表,请参阅字符串和文本类(。这些是作为类模板实现的,为您提供了可靠地执行转换所需的更多控制。模板非类型参数允许您控制静态缓冲区。更重要的是,这些类模板具有具有显式代码页参数的构造函数,因此您可以执行所需的转换(包括从 UTF-8 到UTF-8的转换(,并在代码中记录您的意图。

最新更新