• C++ wstring string char* wchar_t相互转换


    头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会。现在从网上找了点资料,看了看,知道点东西了。

      一、string转char*。

      主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy();

      1.data()方法,如:

    1 string str = "hello";
    2 const char* p = str.data();//加const  或者用char * p=(char*)str.data();的形式

      同时有一点需要说明,这里在devc++中编译需要添加const,否则会报错invalid conversion from const char*  to char *,这里可以再前面加上const或者在等号后面给强制转化成char*的类型。

      下面解释下该问题,const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,那么通过char*就可以修改const char指向的内容了,这是不允许的。所以char*要另外开辟新的空间,即上面的形式。

      2.c_str()方法,如:

    1 string str=“world”;
    2 const char *p = str.c_str();//同上,要加const或者等号右边用char*

      3.copy()方法,如:

    1 string str="hmmm";
    2 char p[50];
    3 str.copy(p, 5, 0);//这里5代表复制几个字符,0代表复制的位置,
    4 *(p+5)=‘’;//注意手动加结束符!!!

      二、char * 转string。

      可以直接赋值。

    1 string s;
    2 char *p = "hello";//直接赋值
    3 s = p;

      这里有一点要说明,当声明了string类型变量s后,用printf("%s",s);是会出错的,因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。

      三、string转char[]

      这个由于我们知道string的长度,可以根据length()函数得到,又可以根据下标直接访问,所以用一个循环就可以赋值了。

    复制代码
    1     string pp = "dagah";
    2     char p[8];
    3     int i;
    4     for( i=0;i<pp.length();i++)
    5         p[i] = pp[i];
    6     p[i] = '';
    7     printf("%s
    ",p);
    8     cout<<p;
    复制代码

     

     四、char[]转string

      这里可以直接赋值。

    1. char*->string

    (1)直接转换

    const char* nodename;
    string temp = nodename;
    string temp2(nodename);

    2. wchar_t*->wstring

    (1)直接转换

    const wchar_t* nodename;
    wstring temp = nodename;
    wstring temp2(nodename);

    3. string->char*

       wstring->char*

    方法一:

    (1)将wstring.c_str()转为wchar_t*

    方法二:

    (1)将string.c_str(), wstring.c_str()转为AnsiString(http://blog.csdn.net/bannico/article/details/7577728),

    (2)将AnsiString.c_str()转为char*

    复制代码
    复制代码
    方法一:
    string temp;
    const char* nodename = temp.c_str();
    方法二:
    struct IPAddress{ std::wstring hostname; std::vector<std::wstring> ips; }; scripting::IPAddress dns = (*pPreloadDns)[i]; AnsiString strA = dns.hostname.c_str(); char * hn = strA.c_str();
    复制代码
    复制代码

    但据说这样很不可靠(http://bbs.csdn.net/topics/30479944),安全的做法是:

    方法三:
    String str="123456"; int len=str.Length(); char *cp=new char[len+1]; StrPCopy(cp, str);

    4. wstring->wchar_t*

        string->w_char*(参见5)

    方法一:

    (1)将wstring.c_str()转为wchar_t*

    方法二.一:

    (1)将wstring.c_str()转为UnicodeString 

    (2)将UnicodeString.c_str()转为wchar_t*

    方法二.二:

    (1)将wstring.c_str()转为AnsiString 

    (2)使用ANSIToUnicode方法将AnsiString.c_str()转为wchar_t*

    复制代码
    复制代码
    方法一:
    wstring temp;
    wchar_t* nodename = temp.c_str();
    方法二.一:
    struct IPAddress{
        std::wstring hostname;
        std::vector<std::wstring> ips;
    };
    
    scripting::IPAddress dns = (*pPreloadDns)[i];
    UnicodeString strA = dns.hostname.c_str();
    //char * hn = strA.c_str();
    wchar_t * hn = strA.c_str();

    方法二.二:
    struct IPAddress{
        std::wstring hostname;
        std::vector<std::wstring> ips;
    };
    
    scripting::IPAddress dns = (*pPreloadDns)[i];
    AnsiString strA = dns.hostname.c_str();
    //char * hn = strA.c_str();
    wchar_t * hn = ANSIToUnicode(strA.c_str());
    复制代码
    复制代码

    5. char*->UnicodeString->wstring, wchar_t*

    (1)将char*转为UnicodeString

    (2)将UnicodeString.c_str()转为wstring, wchar_t*

    UnicodeString temp(inet_ntoa(pAddr->sin_addr)) ; //inet_ntoa returns char*
    std::wstring addr(temp.c_str());
    wchar_t* addr2 = temp.c_str();
    log_debug(_T("set connection ip:") << addr); con->setIP(addr);

    6. wchar_t*->AnsiString->string, char*

    (1)将wchar_t*转为AnsiString

    (2)将AnsiString.c_str()转为string, char*

    wchar_t* str = wstring.c_str();
    AnsiString temp(str ) ; //inet_ntoa returns char*
    std::string addr(temp.c_str());
    char* addr2 = temp.c_str();
    log_debug(_T("set connection ip:") << addr); con->setIP(addr);

    下面关于string,wstring互转的方法是错误的。对ansi字符可能能得到正确结果,但如果传入的参数是“中文”字符串,将得不到正确的结果。

     7. string->wstring 

    复制代码
    复制代码
    static wstring Str2Wstr (string str )
    {
        if (str.length() == 0)
            return L"";
    
        std::wstring wstr;
        wstr.assign (str.begin(), str.end());
        return wstr;
    }
    复制代码
    复制代码

     8. wstring->string

    复制代码
    复制代码
    static string Wstr2Str(wstring wstr )
    {
        if (wstr.length() == 0)
            return "";
    
        std::string str;
        str.assign (wstr.begin(), wstr.end());
        return str;
    }
    复制代码
    复制代码

     正确的做法是使用MultiByteToWideChar和WideCharToMultiByte:

    9. string->wstring

    复制代码
    复制代码
    std::wstring stringToWstring(const std::string& str)
    {
        LPCSTR pszSrc = str.c_str();
        int nLen = MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, 0);
        if (nLen == 0) 
            return std::wstring(L"");
    
        wchar_t* pwszDst = new wchar_t[nLen];
        if (!pwszDst) 
            return std::wstring(L"");
    
        MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen);
        std::wstring wstr(pwszDst);
        delete[] pwszDst;
        pwszDst = NULL;
    
        return wstr;
    }
    复制代码
    复制代码

    10. wstring->string

    复制代码
    复制代码
    std::string wstringToString(const std::wstring& wstr)
    {
        LPCWSTR pwszSrc = wstr.c_str();
        int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
        if (nLen == 0) 
            return std::string("");
    
        char* pszDst = new char[nLen];
        if (!pszDst) 
            return std::string("");
    
        WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
        std::string str(pszDst);
        delete[] pszDst;
        pszDst = NULL;
    
        return str;
    }
    复制代码
    复制代码

    测试代码:

    复制代码
    复制代码
    int _tmain(int argc, _TCHAR* argv[])
    {
        std::string str = "中文";
        std::wstring wstr = L"中文";
        std::string str1 = "";
        std::wstring wstr1 = L"";
        LPCSTR pSrc = "中文";
        LPCWSTR pwzSrc = L"中文";
    
        stringToWstring(str);
        wstringToString(wstr);
        stringToWstring(str1);
        wstringToString(wstr1);
        stringToWstring(pSrc);
        wstringToString(pwzSrc);
    
        return 0;
    }
    复制代码
    复制代码

    Original URL: http://www.cnblogs.com/zhcncn/archive/2013/05/20/3089084.html

    wstring与string相互转换

    转自:http://www.cnblogs.com/SunboyL/archive/2013/03/31/stringandwstring.html

     View Code

    VS2005:C++ std::string, std::wstring转换方法(转)

    转自:http://blog.sina.com.cn/s/blog_700a65cc0100migm.html

    随着VS2003升级到VS2005,很多以前熟悉的输入输出方式以及参数传递方式都不再有效(参看vs2003 到vs2005代码升级要点)。其中根字符串相关的内容是,wcout不再有效,默认参数传递方式由char*改成了wchar_t*等几个方面。为了解决上面的这些问题,这篇文章里,我将给出几种C++ std::string和std::wstring相互转换的转换方法。

    第0种方法,更新于(2009年3月22):好久不用windows,好久不用VS.net了。今天网上查找资料,看到下述实现,记录未验证。(抽空去验证了一下,这个,好像对中文无效...)

    std::wstring s2ws(const std::string& s)
    {
        std::wstring temp(s.length(),L‘ ‘);
        std::copy(s.begin(), s.end(), temp.begin());
        return temp;
    }

    std::string ws2s(const std::wstring& s)
    {
        std::string temp(s.length(),‘ ‘);
        std::copy(s.begin(), s.end(), temp.begin());
        return temp;
    }

    第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》):
     
    #include<string>
    #include<windows.h>
     
    usingnamespace 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 = newchar[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>
    usingnamespace 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>
    usingnamespace std;
    string ws2s(const wstring& ws)
    {
             string curLocale = setlocale(LC_ALL, NULL);        // curLocale = "C";
     
             setlocale(LC_ALL, "chs");
     
             constwchar_t* _Source = ws.c_str();
             size_t _Dsize = 2 * ws.size() + 1;
             char *_Dest = newchar[_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");
     
             constchar* _Source = s.c_str();
             size_t _Dsize = s.size() + 1;
             wchar_t *_Dest = newwchar_t[_Dsize];
             wmemset(_Dest, 0, _Dsize);
             mbstowcs(_Dest,_Source,_Dsize);
             wstring result = _Dest;
             delete []_Dest;
     
             setlocale(LC_ALL, "C");
     
             return result;
    }
     
    //第四种方法,标准C++转换方法:(待续)
    //第五种方法,在C++中使用C#类库:(待续
     其中第四种,我的实现始终存在一些问题。 第五种,我只是知道有这么一种方案,没有时间去详细了解,算是给一些提示吧。

    std::string 与 std::wstring 转换方法的效率比较(转)

    转自:http://blog.csdn.net/goof/article/details/7662652

     View Code

    输出:

    Time:78ms

    Time:94ms

    Time:62ms

    Time:109ms

    从输出结果可以看出

    WideCharToMultiByte MultiByteToWideChar转换效率要比 mbstowcswcstombs高。

    注意:如果使用mbstowcs则需要Disable Specific Warnings: 4996

    示例代码:转自:http://codereview.stackexchange.com/questions/419/converting-between-stdwstring-and-stdstring

    Here's a cross platform version I've written for a framework I'm working on, it uses the UTF8 code page but fell free to change as needed. This is a slimmed version as it doesn't contain all of the explicit macro definitions, but you can get the idea from it:

     View Code

    Here's an example using it:

    std::string s = "here's a standard string";
    std::wstring w = L"here's a wide string";
    std::string sw = omni::string::to_string(w);
    std::wstring ws = omni::string::to_wstring(s);
    
    std::cout << "s = " << s << std::endl;
    std::wcout << "w = " << w << std::endl;
    std::cout << "sw = " << sw << std::endl;
    std::wcout << "ws = " << ws << std::endl;
  • 相关阅读:
    Matlab norm 用法小记
    C51存储器类型 MCS51单片机物理存储器区域
    MATLAB 中NORM运用
    Matlab norm 用法小记
    C51存储器类型 MCS51单片机物理存储器区域
    MATLAB 中NORM运用
    poj2031
    poj1039
    poj3122
    poj3980
  • 原文地址:https://www.cnblogs.com/weekbo/p/9628506.html
Copyright © 2020-2023  润新知