在基于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
。
我已经尝试了this thread中讨论的所有变体,结果是相同的。我还尝试将Visual Studio项目中的字符集从使用Unicode字符集更改为使用多字节字符集,再次无效。
转换失败的原因可能是什么?
编辑:
更多测试表明std::string
的值似乎没有什么不同:
tmp as String: The quick brown fox jumps over the lazy dog
tmp as CString: 00EAAF88
我还将字符集设置为未设置,这也没有帮助。
答案 0 :(得分:6)
问题是打印不转换。
CString
可能被非法转换为TCHAR const*
。在启用了Unicode的情况下进行构建时,该文件为wchar_t const*
。
std::cout
没有wchar_t const*
的{{1}}重载。它确实有<<
重载。
void指针重载以十六进制打印指针地址。
在打印前投射到void const*
:
CStringA
或使用std::cout << "as CString: " << static_cast<CStringA>(cString) << std::endl;
打印。
答案 1 :(得分:3)
问题是两个方面的结合:
std::string
)和通用文本映射(CString
与CStringA
/ CStringW
的字符串类型的混合。CString
可以通过conversion c'tors在编码之间进行转换。将std::string
转换为CString
很好,大概构造了一个CStringW
对象。由于没有operator<<
占用std::ostream
的{{1}}(wchar_t const*
implicitly converts to)的CStringW
重载,它只打印地址,与通用{{ 1}}重载。
这里的解决方案是将通用文本映射从图片中取出,并构造与源编码(void const*
,即CString
的ANSI匹配的std::string
专业化: / p>
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;
时获得有关隐式转换的通知,可以CString
#define
预处理程序符号。如果您尝试调用任何转换控制器,则会反过来产生编译器错误。