当前位置:C++技术网 > 资讯 > 宽字符串与窄字符串的相互转换

宽字符串与窄字符串的相互转换

更新时间:2015-06-23 16:10:23浏览次数:1+次

    在Windows和MFC中使用C字符串来处理问题,经常会遇见宽窄字符的转换问题,处理起来还真心不容易。要么就全部使用宽字符,要么就全部窄字符,这样处理起来就方便。但是特殊情况下,确实需要转换。下面的代码就展示了相互转换。

//宽字符串转换到窄字符串
char* pC=NULL;//窄字符串指针
wchar_t wStr[20]=L"宽字符串";//宽字符数组
int iLen = WideCharToMultiByte(CP_ACP,0,wStr,-1,NULL,0,NULL,NULL);//获取宽字符串字符长度
if(iLen>0)
{
    pC = (char*)HeapAlloc(GetProcessHeap(),0,iLen);//为窄字符串缓存分配空间
    if(!pC)return;
    WideCharToMultiByte(CP_ACP,0,wStr,-1,pC,iLen,NULL,NULL);//将宽字符串转换成窄字符串
    printf("%s\n",pC);//将窄字符串打印出来
    HeapFree(GetProcessHeap(),0,pC);//释放内存
}

//窄字符串转换到宽字符串
char cStr[20]="这是窄字符串";//窄字符数组
wchar_t* pWideString = NULL;//宽字符串指针
int iLenWide = MultiByteToWideChar(CP_ACP,0,cStr,-1,NULL,0);//获取窄字符串字符长度
if (iLenWide>0)
{
    //pWideString = (wchar_t*)HeapAlloc(GetProcessHeap(),0,iLenWide*sizeof(wchar_t));//分配内存,同上
    pWideString = (wchar_t*)malloc(iLenWide*sizeof(wchar_t));//第二种方式分配内存,效果与前一种一样
    if(!pWideString)return;
    MultiByteToWideChar(CP_ACP,0,cStr,-1,pWideString,iLenWide);//窄字符转换成宽字符
    MessageBox(NULL,pWideString,0,0);//显示宽字符消息内容
    //HeapFree(GetProcessHeap(),0,pWideString);//与第一种分配对应的释放内存
    free(pWideString);//与第二种分配内存对应的释放内存
}

    下面做一个详细的分析。
    WideCharToMultiByte:宽字符串转换到窄字符串。第三个参数是宽字符串指针,第四个参数为宽字符串字符数,第五个为窄字符串指针,第六个为窄字符串字节数,第七和第八个分别为宽字符转为为窄字符失败时默认的替换字符,传入NULL,则使用系统默认的。最后一个参数是一个布尔指针,接受转换时是否有字符转换失败,有一个失败就传回真,全部转换成功,则传回假。一般不进行判断,就将最后两个参数设为NULL。
    MultiByteToWideChar:窄字符串转换到宽字符串。第三个参数是窄字符串指针,第四个参数为窄字符串字节数,第五个为宽字符串指针,第六个为宽字符串字符数。
    以上两个函数就是核心函数,成对使用,参数也相似。第一个参数是代码页,一般使用CP_ACP(其他代码页,以及代码页含义,参考MSDN)。第二个参数是一个标志,用来设置控制方式(详见MSDN)。一般不用,设置为0即可。前两个参数是一样的。
    如果这两个函数的第五个参数传入NULL,第六个参数传入0,则函数会返回第三个参数所指的字符串的字符数。而在分配内存时,是按照字节分配的,所以,分配宽字符串缓存时需要将字符数乘上一个字符所占的内存大小。而窄字符一个字符就一个字节,因此就不用再计算了。
    分配和释放内存的函数malloc和free在此就不多说,相信对C熟悉一些的,都不会陌生。malloc就是根据传入的指定要分配的字节大小的参数分配内存,返回一个void*类型的指针,需要转换后才能赋值给指针。free就直接传入由malloc分配的内存地址。两个一定要成对使用。
    而HeapAlloc和HeapFree也是一对分配内存的函数,也是要成对使用。GetProcessHeap函数返回进程的堆句柄,HeapAlloc第一个参数需要一个堆句柄,分配内存就在这个堆中分配。第二个参数是可选的控制标志,第三个为要分配的字节大小。也是返回一个void*指针。
    前面一对函数为C函数,后一对为Windows函数,功能类似。