zoukankan      html  css  js  c++  java
  • 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;  
    }  

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

  • 相关阅读:
    Lakehouse: 统一数据仓库和高级分析的新一代开放平台
    mac进入恢复模式,关闭/启动系统完整性(SIP)
    多个xcode版本并存,切换xcode版本
    pod执行指定缓存目录,多版本pod执行缓存目录被清问题
    java特殊处理String.format中的%,使用%做一次转义
    html div设置占屏幕占比高度(使用vh)
    vue+leaflet 地图相关
    vue 集成天地图
    vue iframe嵌套外部网页
    Fabric.js
  • 原文地址:https://www.cnblogs.com/ghw0501/p/4733885.html
Copyright © 2011-2022 走看看