C++ wstring string char* wchar_t相互轉換

頭段時間有人問過我這個問題,但是我一點頭緒都沒有,直接說不會。如今從網上找了點資料,看了看,知道點東西了。html

  1、string轉char*。node

  主要有三種方法能夠將str轉換爲char*類型,分別是:data(); c_str(); copy();c++

  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*的類型。windows

  下面解釋下該問題,const char*是不能直接賦值到char*的,這樣編譯都不能經過,理由:假如能夠的話,那麼經過char*就能夠修改const char指向的內容了,這是不容許的。因此char*要另外開闢新的空間,即上面的形式。安全

  2.c_str()方法,如:ide

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)=‘\0’;//注意手動加結束符!!!

 

  2、char * 轉string。測試

  能夠直接賦值。idea

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

  這裏有一點要說明,當聲明瞭string類型變量s後,用printf("%s",s);是會出錯的,由於「%s」要求後面的對象的首地址。可是string不是這樣的一個類型。因此確定出錯。

 

  3、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] = '\0';
7     printf("%s\n",p);
8     cout<<p;
複製代碼

 

 

 

 4、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>
 
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 = 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>
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");
 
         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;
相關文章
相關標籤/搜索