zoukankan      html  css  js  c++  java
  • 【转】string和wstring相互转换

    转自:http://blog.csdn.net/li_guotao/article/details/2308260

    随着VS2003升级到VS2005,很多以前熟悉的输入输出方式以及参数传递方式都不再有效(参看 vs2003 vs2005代码升级要点http://bianyongtao.spaces.live.com/blog/cns!DD6CD3607CCE4603!214.entry )。其中根字符串相关的内容是,wcout不再有效,默认参数传递方式由char*改成了wchar_t*等几个方面。为了解决上面的这些问题,这篇文章里,我将给出几种C++ std::stringstd::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;
    }
    //
    第四种方法,标准C++转换方法:(待续)
    //
    第五种方法,在C++中使用C#类库:(待续

    其中第四种,我的实现始终存在一些问题。第五种,我只是知道有这么一种方案,没有时间去详细了解,算是给一些提示吧。 

  • 相关阅读:
    MOSS中的WebPart开发
    坚持学习WF(8):本地服务之调用外部方法
    坚持学习WF(9):本地服务之事件处理
    MOSS中如何自定义WebService
    uHub 0.4.1 发布,ADC 网络枢纽
    电商网站的宕机案例分析
    JID 2.0.1 发布,高性能的 Java 序列化库
    YaCy 1.2 发布,基于P2P的分布式Web搜索引擎
    Notepad++ 6.2.0 正式版
    Windows上 IE10 最快,Mac上Chrome 19最快
  • 原文地址:https://www.cnblogs.com/abinxm/p/2319247.html
Copyright © 2011-2022 走看看