wchar_t char string wstring 相互转换

31 篇文章 0 订阅
26 篇文章 1 订阅
第一种方法:调用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;
}

在处理中文时有时需要进行wchar_t,char,string,wstring之间的转换。

其中char和string之间、wchar_t和wstring之间的转换较为简单,代码在vs2010下测试通过。

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <string>  
  3. #include <tchar.h>  
  4. #include <Windows.h>  
  5.   
  6. using namespace std;  
  7.   
  8. //Converting a WChar string to a Ansi string  
  9. char *w2c(char *pcstr,const wchar_t *pwstr, size_t len)  
  10. {  
  11.     int nlength=wcslen(pwstr);  
  12.     //获取转换后的长度  
  13.     int nbytes = WideCharToMultiByte( 0, 0, pwstr, nlength, NULL,0,NULL, NULL );   
  14.     if(nbytes>len)   nbytes=len;  
  15.     // 通过以上得到的结果,转换unicode 字符为ascii 字符  
  16.     WideCharToMultiByte( 0,0, pwstr, nlength,   pcstr, nbytes, NULL,   NULL );  
  17.     return pcstr ;  
  18. }  
  19.   
  20. int main(){  
  21.   
  22.     setlocale(LC_ALL,"chs");  
  23.     char* cc = "this is a char 测试";  
  24.     wchar_t* wcc = L"this is a wchar 测试";  
  25.     string str("this is a string 测试 ");  
  26.     wstring wstr = L"this is a wstring 测试";  
  27.   
  28.   
  29.     //string to char  
  30.     const char* char_test = str.c_str();   
  31.     //cout<<"char_test:"<<char_test<<endl;  
  32.   
  33.     //char to string  
  34.     string ss = cc;  
  35.     //cout<<"ss is :"<<ss<<endl;  
  36.   
  37.     //wstring to wchar  
  38.     const wchar_t* wchar_test = wstr.c_str();   
  39.     //wcout<<wchar_test<<endl;  
  40.   
  41.     //wchar to wstring  
  42.     wstring wss = wcc;  
  43.     wcout<<wcc<<endl;  
  44.   
  45.     //char to wchar_t  
  46.     wchar_t *wc = new wchar_t[str.size()+1];  
  47.     //swprintf(wc,L"%S",cc);   
  48.     //wcout<<cc<<endl;  
  49.     delete []wc;  
  50.       
  51.     // wchar_t to char  
  52.     char *pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(wcc)+1));  
  53.     memset(pcstr , 0 , 2 * wcslen(wcc)+1 );  
  54.     w2c(pcstr,wcc,2 * wcslen(wcc)+1) ;  
  55.     free(pcstr);  
  56.       
  57.     system("pause");  
  58.     return 1;  
  59. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值