wchar*与char *相互转换 [MultiByteToWideChar、WideCharToMultiByte函数用法]

所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.这个是我们需要转化的多字节字符串:
char sText[20] = {"多字节字符串!OK!"};
我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.所幸,我们能够确知所需要的数组空间. 我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
接下来,我们只需要分配响应的数组空间:
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText) { delete []pwText; }
接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:
MultiByteToWideChar (CP_ACP, 0, sText, strlen(sText)+1, pwText, dwNum/sizeof(wchar[0]));
最后,使用完毕当然要记得释放占用的内存:
delete []pwText;
同理,宽字符转为多字节字符的代码如下:
 wchar_t  wText[20] = {L"宽字符转换实例!OK!"};
DWORD dwSize=WideCharToMultiByte(CP_ACP,NULL,wText,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwSize];
 if(!psText) { delete []psText; }
 WideCharToMultiByte (CP_ACP,NULL,wText,-1,psText,dwSize,NULL,FALSE);
delete []psText;


示例源码:[win32 console application--vc++6.0]
#include <windows.h>  
#include <stdio.h>  
#include <locale.h>

//function: charTowchar  
//purpose:char to WCHAR 、wchar_t、LPWSTR etc  
void charTowchar(const char *chr, wchar_t *wchar, int size)  
{     
    MultiByteToWideChar( CP_ACP, 0, chr,  
        strlen(chr)+1, wchar, size/sizeof(wchar[0]) );  
}  
  
//function: wcharTochar  
//purpose:WCHAR 、wchar_t、LPWSTR to char  
void wcharTochar(const wchar_t *wchar, char *chr, int length)  
{  
    WideCharToMultiByte( CP_ACP, 0, wchar, -1,  
        chr, length, NULL, NULL );  
}  
  
int main (void)  
{  
    wchar_t  *wchar0 = L"辛若波abc";  
      
  
    //wchar_t to char 
DWORD dwNum=WideCharToMultiByte(CP_ACP,NULL,wchar0,-1,NULL,0,NULL,FALSE); 
char  *chr=new char[dwNum];  
if(!chr) { delete []chr; }
    wcharTochar(wchar0, chr, dwNum);  
    printf("char is %s,size is %d.\n", chr, dwNum);  
  
    //char to wchar_t
DWORD dwSize = MultiByteToWideChar (CP_ACP, 0, chr, -1, NULL, 0);
int dn=2*dwSize;
    wchar_t *wchr = new wchar_t[dn];
if(!wchr) { delete []wchr; }
    charTowchar(chr, wchr, 2*dwSize);  


setlocale(LC_ALL, "chs");
    //setlocale( LC_ALL, "Chinese-simplified" );
    //setlocale( LC_ALL, "ZHI" );
    //setlocale( LC_ALL, ".936" );
    wprintf(L"wchar is %s", wchr); printf(",size is %d.\n",2*dwSize);

    getchar();    
    return 0;  
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/ghw0501/p/4733885.html