ala*_*ncc 4 c++ string unicode mfc visual-c++
过去,我使用CT2W和CT2A在 Unicode 和 Ansi 之间转换字符串。现在看来,CStringW也CStringA可以完成同样的任务。
我编写以下代码片段:
CString str = _T("Abc");
CStringW str1;
CStringA str2;
CT2W str3(str);
CT2A str4(str);
str1 = str;
str2 = str;
Run Code Online (Sandbox Code Playgroud)
当我分配给它们时,它似乎CStringW也CStringA通过使用来执行转换。WideCharToMultibytestr
CT2W那么,使用/CT2A代替CStringW/的优点是什么CStringA,因为我从未听说过后一对。两位 MS 均不建议使用后一对进行转换。
CString提供了许多转换构造函数来在 ANSI 和 Unicode 编码之间进行转换。它们既方便又危险,经常掩盖错误。MFC 允许您通过定义预处理器符号(您可能应该这样做)来禁用隐式转换_CSTRING_DISABLE_NARROW_WIDE_CONVERSION。CString转换始终涉及使用堆分配存储创建新对象(忽略短字符串优化)。
相比之下,Cs2d宏(其中s= 源,d= 目标)适用于原始 C 样式字符串;CString在字符编码之间转换的过程中不会创建任何实例。除了堆分配的缓冲区(以防转换需要更多空间)之外,堆栈上还始终分配 128 个代码单元的临时缓冲区。
上述两者都使用隐含的 ANSI 代码页执行转换(或者CP_THREAD_ACP在定义了预处理器符号的CP_ACP情况下)。特别麻烦,因为它是进程全局设置,任何线程都可以随时更改。_CONVERSION_DONT_USE_THREAD_LOCALECP_ACP
您应该选择哪一种进行转化?以上都不是。请改用EX版本(有关完整列表,请参阅字符串和文本类)。它们以类模板的形式实现,为您提供可靠执行转换所需的更多控制。模板非类型参数允许您控制静态缓冲区。更重要的是,这些类模板具有带有显式代码页参数的构造函数,因此您可以执行所需的转换(包括从 UTF-8 到 UTF-8),并在代码中记录您的意图。