CString
非常方便,而std::string
与STL容器更兼容。我正在使用hash_map
。但是,hash_map
不支持CString
s作为键,所以我想将CString
转换为std::string
。
编写一个CString
散列函数似乎需要花费很多时间。
CString -----> std::string
我该怎么做呢?
std::string -----> CString:
inline CString toCString(std::string const& str)
{
return CString(str.c_str());
}
我说的对吗?
编辑:
以下是更多问题:
如何在wstring
和CString
之间相互转换?
// wstring -> CString
std::wstring src;
CString result(src.c_str());
// CString -> wstring
CString src;
std::wstring des(src.GetString());
这有什么问题吗?
另外,如何在std::wstring
和std::string
之间相互转换?
发布于 2018-08-21 17:14:40
(从VS2012 ...and开始,至少到VS2017 v15.8.1)
由于它是一个MFC项目& CString是一个MFC类,微软提供了一个技术说明TN059: Using MFC MBCS/Unicode Conversion Macros和泛型转换宏:
A2CW (LPCSTR) -> (LPCWSTR)
A2W (LPCSTR) -> (LPWSTR)
W2CA (LPCWSTR) -> (LPCSTR)
W2A (LPCWSTR) -> (LPSTR)
使用:
void Example() // ** UNICODE case **
{
USES_CONVERSION; // (1)
// CString to std::string / std::wstring
CString strMfc{ "Test" }; // strMfc = L"Test"
std::string strStd = W2A(strMfc); // ** Conversion Macro: strStd = "Test" **
std::wstring wstrStd = strMfc.GetString(); // wsrStd = L"Test"
// std::string to CString / std::wstring
strStd = "Test 2";
strMfc = strStd.c_str(); // strMfc = L"Test 2"
wstrStd = A2W(strStd.c_str()); // ** Conversion Macro: wstrStd = L"Test 2" **
// std::wstring to CString / std::string
wstrStd = L"Test 3";
strMfc = wstrStd.c_str(); // strMfc = L"Test 3"
strStd = W2A(wstrStd.c_str()); // ** Conversion Macro: strStd = "Test 3" **
}
--
脚注:
(1)为了使转换宏有存储临时长度的空间,有必要在使用转换宏的每个函数中声明一个名为_convert
的局部变量来执行此操作。这是通过调用USES_CONVERSION
宏来完成的。在VS2017 MFC代码(atlconv.h)中,它看起来像这样:
#ifndef _DEBUG
#define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)
#else
#define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)
#endif
https://stackoverflow.com/questions/258050
复制相似问题