您的位置:首页 > 其它

MBS与Unicode字符的相互转换

2013-04-25 07:40 302 查看
共有3种方法

1. Windows API

2. C API

3. ATL中的转换宏

第一种方法(windows API)

主要使用WideCharToMultiByte与MultiByteToWideChar这两个函数

string str="字符转换测试A";
wstring wstr=L"字符转换测试A";
/*宽字节转换为单字节
计算转换所需的字节数,包括NULL字符*/
int size1=WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,NULL,0,NULL,false);  //size为14
char *dest1=new char[size1];
WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,dest1,size1,NULL,false);
cout<<dest1;
delete[] dest1
//单字节转换为宽字节
int size2=MultiByteToWideChar(CP_ACP,0,str.c_str(),-1,NULL,0);   //size为8
WCHAR *dest2=new WCHAR[size2];
MultiByteToWideChar(CP_ACP,0,str.c_str(),-1,dest2,size2);
delete[] dest2

其中CP_ACP与CP_OEMCP一样。

第二种方法(C API)

主要使用wcstombs与mbstowcs

//计算转换为单字节的长度(不含\0字符),只有中文字符可以这样算,中英混合长度就比实际大,
//对实际结果影响不大
int size1=wcstombs(NULL,wstr.c_str(),0)*2+1;      //size为15
char *dest1=new char[size1];
setlocale(LC_ALL,"");     //设置本地默认Locale
wcstombs(dest1,wstr.c_str(),size1);
setlocale(LC_ALL,"C");     //设置单字节
cout<<dest1;

//计算转换为宽字节的长度,可能比实际大
int size2=mbstowcs(NULL,str.c_str(),0)+1;    //size为14
WCHAR *dest2=new WCHAR[size2];
setlocale(LC_ALL,"");     //设置本地默认Locale
mbstowcs(dest2,str.c_str(),size2);
setlocale(LC_ALL,"W");     //设置宽字节
cout<<dest2;


第三种方法ATL转投宏(最简单)

CA2W 将单字节转换为宽字节

CW2A 将宽宽限转换为单字节

CA2W str("hello, world");
WHCAR * str2=str;

CW2A str=L"hello, world";
char * str2=str;


补充:unicode与utf8的相互转换

//unicode 转utf8
WCHAR *str=_T("中文abc");
int i = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, FALSE);    //8
char *utf8=new char[i];
int j=WideCharToMultiByte(CP_UTF8, 0, str, -1, utf8, i, NULL, FALSE);

//utf8转unicode
int k = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);          //6
WCHAR *strSrc = new WCHAR[k];
MultiByteToWideChar(CP_UTF8, 0,utf8, -1, strSrc, k);
MessageBox(strSrc);


ATL宏转换

//unicode转utf8
CW2A str(_T("中国abc"),CP_UTF8);
//uft8转unicode
CA2W str3(str,CP_UTF8);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: