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

标签 c++ string visual-c++ unicode mfc

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

我写了下面的代码片段:

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

str1 = str;
str2 = str;

似乎 CStringWCStringA 在我将 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_ACPCP_ACP) . CP_ACP 特别麻烦,因为它是一个进程全局设置,任何线程都可以随时更改。

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

关于c++ - 使用CStringW/CStringA和CT2W/CT2A转换字符串有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59404120/

相关文章:

c++在模板函数中初始化大小为 "static * int"的char数组

c++ - MachineGuid 的 Linux 等价物

php - 从字符串中的引号中提取时如何包含等号和引号?

php - 如何使用 preg_replace 获取替换文本?

c++ - 我可以在现代 Intel Core CPU 上测量分支预测失败吗?

c++ - 为什么没有专门用于 c 或 c++ 的编译器?

c++ - Qt C++ tcp 客户端与 python 扭曲服务器

Java 字符串到 Python 字符串编码 "error"

debugging - 除了查找可重现的内存泄漏之外,我还可以使用 Visual C++ 调试 CRT 分配 Hook 做哪些有用的事情?

visual-c++ -/show在g++中包含等效选项