• 几种C++ std::string和std::wstring相互转换的转换方法(转)


    几种C++ std::string和std::wstring相互转换的转换方法

    第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》):

    #include <string>
    #include <windows.h>
    using namespace std;
    //Converting a WChar string to a Ansi string
    std::string WChar2Ansi(LPCWSTR pwszSrc)
    {
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);

    if (nLen<= 0) return std::string("");

    char* pszDst = new char[nLen];
    if (NULL == pszDst) return std::string("");

    WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
    pszDst[nLen -1] = 0;

    std::string strTemp(pszDst);
    delete [] pszDst;

    return strTemp;
    }

    string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); }

    //Converting a Ansi string to WChar string

    std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)

    {
    int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
    if(nSize <= 0) return NULL;

    WCHAR *pwszDst = new WCHAR[nSize+1];
    if( NULL == pwszDst) return NULL;

    MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
    pwszDst[nSize] = 0;

    if( pwszDst[0] == 0xFEFF) // skip Oxfeff
    for(int i = 0; i < nSize; i ++)
    pwszDst[i] = pwszDst[i+1];

    wstring wcharString(pwszDst);
    delete pwszDst;

    return wcharString;
    }

    std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}

    第二种方法:采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下面代码可以在VS2005通过,无移植性);
    #include <string>
    #include <comutil.h>
    using namespace std;
    #pragma comment(lib, "comsuppw.lib")

    string ws2s(const wstring& ws);
    wstring s2ws(const string& s);

    string ws2s(const wstring& ws)
    {
    _bstr_t t = ws.c_str();
    char* pchar = (char*)t;
    string result = pchar;
    return result;
    }

    wstring s2ws(const string& s)
    {
    _bstr_t t = s.c_str();
    wchar_t* pwchar = (wchar_t*)t;
    wstring result = pwchar;
    return result;
    }

    第三种方法:使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale。
    #include <string>
    #include <locale.h>
    using namespace std;
    string ws2s(const wstring& ws)
    {
    string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";

    setlocale(LC_ALL, "chs");

    const wchar_t* _Source = ws.c_str();
    size_t _Dsize = 2 * ws.size() + 1;
    char *_Dest = new char[_Dsize];
    memset(_Dest,0,_Dsize);
    wcstombs(_Dest,_Source,_Dsize);
    string result = _Dest;
    delete []_Dest;

    setlocale(LC_ALL, curLocale.c_str());

    return result;
    }

    wstring s2ws(const string& s)
    {
    setlocale(LC_ALL, "chs");

    const char* _Source = s.c_str();
    size_t _Dsize = s.size() + 1;
    wchar_t *_Dest = new wchar_t[_Dsize];
    wmemset(_Dest, 0, _Dsize);
    mbstowcs(_Dest,_Source,_Dsize);
    wstring result = _Dest;
    delete []_Dest;

    setlocale(LC_ALL, "C");

    return result;
    }

  • 相关阅读:
    CSS命名规范
    dev 从表处理
    core直接获取报异常数据
    SQL根据指定节点ID获取所有父级节点和子级节点(转载)
    bootstrap的tree使用
    ef报错(因为相同类型的其他实体已具有相同的主键值)
    yii初体验(2)创建方法
    yii初体验(1)composer安装+环境检测
    layui数据表格中图片无法自适应问题
    tp5查询数据库排除某字段
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/1806288.html
Copyright © 2020-2023  润新知