令人吐血的CStringA CStringW wchar_t char转换

来源:互联网 发布:电子相册下载软件下载 编辑:程序博客网 时间:2024/06/05 15:46


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;
}