CStringA WChar2Char( const wchar_t* wszStr )
{
CStringA cStr;
if( NULL == wszStr )
{
return cStr;
}
int iSize = ::WideCharToMultiByte( CP_ACP, 0, wszStr, -1, NULL, 0, NULL,NULL );
char* p = cStr.GetBuffer( iSize + 10 );
memset( p, 0, iSize+10 );
iSize = ::WideCharToMultiByte( CP_ACP, 0, wszStr, -1, p, iSize, NULL, NULL);
cStr.ReleaseBuffer();
return cStr;
}
CStringW Char2WChar( const char* szStr )
{
CStringW wStr;
if( NULL == szStr )
{
return wStr;
}
int nLen = ::MultiByteToWideChar( CP_ACP, 0, szStr, -1, NULL,0);
wchar_t* p = wStr.GetBuffer( nLen+10 );
wmemset( p, 0, nLen+10 );
nLen = ::MultiByteToWideChar( CP_ACP,0,szStr,-1,p,nLen);
wStr.ReleaseBuffer();
return wStr;
}
cc = WChar2Char(str.GetBuffer()).GetBuffer();
CStringW 转 wchar*:
CStringW bb = L"TUXUE";
const wchar* = bb.GetBuffer(sizeof(bb));
CStringA 转 char*:
CStringA aa = "TUXUE";
const char* = bb.GetBuffer(sizeof(bb));
以上两种也可以:
tchar* aa = (LPTSTR)(LPCTSTR)bb;
另外,为了方便大家这种频繁的操作,已经有定义W2A A2W两个宏,使用如下:
#include<atlconv.h>
使用时在宏前一行定义:USES_CONVERSION; DoSomethingW(A2W("something")); DoSomethingA(W2A(L"something));
所以也可以
CStringW bb = L"TUXUE";
char* aa = W2A((LPWSTR)(LPCWSTR)bb);
//
VC++中通过WideCharToMultiByte将wstring|wchar_t*转换为string|char* - [VC++编程]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://flyxxtt.blogbus.com/logs/43623461.html
函数原型:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
参数说明:
1、CodePage
指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,可以选择以下的代码页:
CP_ACP //当前系统ANSI代码页
CP_MACCP //当前系统Macintosh代码页
CP_OEMCP //当前系统OEM代码页,一种原始设备制造商硬件扫描码
CP_SYMBOL //Symbol代码页,用于Windows 2000及以后版本
CP_THREAD_ACP //当前线程ANSI代码页,用于Windows 2000及以后版本
CP_UTF7 //UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
CP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
2、dwFlags
指定如何处理没有转换的字符,一般情况下设为0
WC_NO_BEST_FIT_CHARS //把不能直接转换成相应多字节字符的Unicode字符转换成lpDefaultChar指定的默认字符。
WC_COMPOSITECHECK //把合成字符转换成预制的字符。它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项WC_SEPCHARS相同。
WC_ERR_INVALID_CHARS //此选项会致使函数遇到无效字符时失败返回,并且GetLastError会返回错误码ERROR_NO_UNICODE_TRANSLATION。否则函数会自动丢弃非法字符。此选项只能用于UTF8
WC_DISCARDNS //转换时丢弃不占空间的字符,与WC_COMPOSITECHECK一起使用
WC_SEPCHARS //转换时产生单独的字符,此是默认转换选项,与WC_COMPOSITECHECK一起使用
WC_DEFAULTCHAR //转换时使用默认字符代替例外的字符,(最常见的如"?"),与WC_COMPOSITECHECK一起使用
3、lpWideCharStr //要转换的宽字符串
4、cchWideChar //要转换宽字符串的长度,-1表示转换到字符串结尾
5、lpMultiByteStr //接收转换后输出的字符串的缓冲区
6、cbMultiByte //输出缓冲区大小,如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不使用lpMultiByteStr。
7、lpDefaultChar //指向字符的指针,在指定编码里找不到相应字符时使用此字符作为默认字符代替,如果为NULL则使用系统默认字符
8、lpUsedDefaultChar //开关变量的指针,用以表明是否使用过默认字符,可设为NULL
返回值:为0表示调用失败
下面就来看看如何将wstring和wchar_t*转换为string和char*
wstring转换为string:
wstring wstr=_T("翔翔糖糖");
int size=WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,NULL,0,NULL,NULL);
char *ch=new char[size+1];
if(!WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,ch,size,NULL,NULL))
{
return false;
}
string str=ch;
wchar_t*转换为char*:
wchar_t *wch=_T("翔翔糖糖");
int size=WideCharToMultiByte(CP_ACP,0,wch,-1,NULL,0,NULL,NULL);
char *ch=new char[size+1];
if(!WideCharToMultiByte(CP_ACP,0,wch,-1,ch,size,NULL,NULL))
{
return false;
}