在我的基于 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 Studio项目中的字符集从">使用Unicode字符集"更改为"使用多字节字符集",但同样没有效果。
转换失败的原因可能是什么?
编辑: 更多的测试表明,std::string
的价值似乎没有区别:
tmp as String: The quick brown fox jumps over the lazy dog
tmp as CString: 00EAAF88
我还将字符集设置为未设置,这也无济于事。
问题是打印而不是转换。
CString
可以隐式转换为TCHAR const*
。 在启用 unicode 的情况下构建时,这是wchar_t const*
.
std::cout
对<<
没有wchar_t const*
过载。 它确实有一个void const*
过载。
void 指针重载以十六进制打印指针地址。
打印前投射到CStringA
:
std::cout << "as CString: " << static_cast<CStringA>(cString) << std::endl;
或使用wcout
.
问题是两个方面的结合:
- 字符串类型与显式编码(
std::string
(和泛型文本映射(CString
vs(的混合CStringA
/CStringW
(。 CString
通过转换 c'tor 在编码之间进行转换的能力。
std::string
转换为CString
很好,大概构造了一个CStringW
对象。由于采用wchar_t const*
(CStringW
隐式转换为(的std::ostream
没有operator<<
重载,因此它仅打印地址,与泛型void const*
重载匹配。
这里的解决方案是将泛型文本映射从图片中剔除,并构建一个与源编码(ANSI forstd::string
(匹配的CString
专用化,即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
s 时获得有关隐式转换的通知,可以#define
_CSTRING_DISABLE_NARROW_WIDE_CONVERSION
处理器符号。这反过来会生成编译器错误,以防您尝试调用任何转换 c'tor。