过去,我使用CT2W
和CT2A
在Unicode 和Ansi 之间转换字符串。现在看来 CStringW
和 CStringA
也可以完成同样的任务。
我写了下面的代码片段:
CString str = _T("Abc");
CStringW str1;
CStringA str2;
CT2W str3(str);
CT2A str4(str);
str1 = str;
str2 = str;
似乎 CStringW
和 CStringA
在我将 str
分配给它们时也使用 WideCharToMultibyte
执行转换。
那么,用CT2W
/CT2A
代替CStringW
/CStringA
有什么好处呢,因为我从来没有听说过后一对。 MS 都不推荐后一对进行转换。
最佳答案
CString
提供了多个 conversion constructors在 ANSI 和 Unicode 编码之间转换。它们既方便又危险,通常会掩盖错误。 MFC 允许您通过定义 _CSTRING_DISABLE_NARROW_WIDE_CONVERSION
预处理器符号(您可能应该这样做)来禁用隐式转换。转换总是涉及创建具有堆分配存储空间的新 CString
对象(忽略短字符串优化)。
相比之下,Cs2d
宏(其中 s
= 源,d
= 目标)处理原始 C 风格字符串;在字符编码之间的转换过程中不会创建 CString
实例。堆栈上始终分配一个包含 128 个代码单元的临时缓冲区,此外还有一个堆分配缓冲区,以防转换需要更多空间。
以上两者都使用隐含的 ANSI 代码页执行转换(如果定义了 _CONVERSION_DONT_USE_THREAD_LOCALE
预处理器符号,则为 CP_THREAD_ACP
或 CP_ACP
) . CP_ACP
特别麻烦,因为它是一个进程全局设置,任何线程都可以随时更改。
您应该为转化选择哪一个?以上都不是。请改用 EX
版本(完整列表请参阅 string and text classes)。这些是作为类模板实现的,可以为您提供可靠执行转换所需的更多控制。模板非类型参数允许您控制静态缓冲区。更重要的是,这些类模板具有带有显式代码页参数的构造函数,因此您可以执行所需的转换(包括从 UTF-8 到 UTF-8 的转换),并在代码中记录您的意图。
关于c++ - 使用CStringW/CStringA和CT2W/CT2A转换字符串有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59404120/