首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将CString和std::string std::wstring相互转换?

如何将CString和std::string std::wstring相互转换?
EN

Stack Overflow用户
提问于 2008-11-03 06:58:46
回答 16查看 225K关注 0票数 81

CString非常方便,而std::string与STL容器更兼容。我正在使用hash_map。但是,hash_map不支持CStrings作为键,所以我想将CString转换为std::string

编写一个CString散列函数似乎需要花费很多时间。

代码语言:javascript
运行
复制
CString -----> std::string

我该怎么做呢?

代码语言:javascript
运行
复制
std::string -----> CString:

inline CString toCString(std::string const& str)
{
    return CString(str.c_str()); 
}

我说的对吗?

编辑:

以下是更多问题:

如何在wstringCString之间相互转换?

代码语言:javascript
运行
复制
// wstring -> CString
std::wstring src;
CString result(src.c_str());

// CString -> wstring
CString src;
std::wstring des(src.GetString());

这有什么问题吗?

另外,如何在std::wstringstd::string之间相互转换?

EN

Stack Overflow用户

发布于 2018-08-21 17:14:40

(从VS2012 ...and开始,至少到VS2017 v15.8.1)

由于它是一个MFC项目& CString是一个MFC类,微软提供了一个技术说明TN059: Using MFC MBCS/Unicode Conversion Macros和泛型转换宏:

代码语言:javascript
运行
复制
A2CW      (LPCSTR)  -> (LPCWSTR)  
A2W       (LPCSTR)  -> (LPWSTR)  
W2CA      (LPCWSTR) -> (LPCSTR)  
W2A       (LPCWSTR) -> (LPSTR)  

使用:

代码语言:javascript
运行
复制
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)中,它看起来像这样:

代码语言:javascript
运行
复制
#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
票数 3
EN
查看全部 16 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/258050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档