在基于MFC的应用程序中,此代码:
std::string stdString("MappingName");
std::cout << "as String: " << stdString << std::endl;
CString cString(stdString.c_str());
std::cout << "as CString: " << cString << std::endl;产生这个输出:
as String: MappingName
as CString: 01DEA060每次运行CString时,它的值都是不同的,但是长度似乎是恒定的。其他一些结果是042219B0和042C4378。
我尝试过在这条线中讨论的每一个变体,结果都是一样的。我还尝试将Visual项目中的字符集从“使用Unicode字符集”更改为“使用多字节字符集”,同样没有任何效果。
转换失败的原因是什么?
编辑:更多的测试表明,std::string的值似乎没有什么区别:
tmp as String: The quick brown fox jumps over the lazy dog
tmp as CString: 00EAAF88我还将字符集设置为Not,这也没有帮助。
发布于 2018-08-19 10:25:57
问题是打印而不是转换。
CString可以隐含地转换为TCHAR const*。在启用unicode的情况下构建时,这是wchar_t const*。
std::cout没有wchar_t const*重载的<<。它确实有一个void const*超载。
空指针重载以十六进制打印指针地址。
在打印前先铸到CStringA:
std::cout << "as CString: " << static_cast<CStringA>(cString) << std::endl;或者使用wcout打印。
发布于 2018-08-19 10:57:43
这个问题综合了两个方面:
std::string)和泛型文本映射(CString与CStringA/CStringW)的混合。CString通过转换c‘在编码之间进行转换的能力。std::string很好地转换为CString,大概是构造了一个CStringW对象。由于不存在接受operator<< ( CStringW 隐式转换为)的wchar_t const*的std::ostream重载,所以它只是打印地址,与一般的void const*重载相匹配。
这里的解决方案是从图片中提取泛型文本映射,并构造一个与源编码相匹配的CString专门化( std::string的ANSI,即CStringA):
std::string stdString("MappingName");
std::cout << "as String: " << stdString << std::endl;
CStringA cString(stdString.c_str());
std::cout << "as CString: " << cString.GetString() << std::endl;要在构造CStrings时得到关于隐式转换的通知,您可以#define _CSTRING_DISABLE_NARROW_WIDE_CONVERSION前处理器符号。这反过来会生成编译器错误,以防您试图调用任何转换c‘’tors。
https://stackoverflow.com/questions/51916665
复制相似问题