zoukankan      html  css  js  c++  java
  • WideCharToMultiByte和MultiByteToWideChar函数的用法

    为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
    WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
    MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
    常用的代码页由CP_ACP和CP_UTF8两个。
    使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
    使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
    下面是代码实现:
    1.  ANSI to Unicode
    wstring ANSIToUnicode( const string& str )
    {
     int  len = 0;
     len = str.length();
     int  unicodeLen = ::MultiByteToWideChar( CP_ACP,
                0,
                str.c_str(),
                -1,
                NULL,
                0 );  
     wchar_t *  pUnicode;  
     pUnicode = new  wchar_t[unicodeLen+1];  
     memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
     ::MultiByteToWideChar( CP_ACP,
             0,
             str.c_str(),
             -1,
             (LPWSTR)pUnicode,
             unicodeLen );  
     wstring  rt;  
     rt = ( wchar_t* )pUnicode;
     delete  pUnicode;
     
     return  rt;  
    }
    2.  Unicode to ANSI
    string UnicodeToANSI( const wstring& str )
    {
     char*     pElementText;
     int    iTextLen;
     // wide char to multi char
     iTextLen = WideCharToMultiByte( CP_ACP,
             0,
             str.c_str(),
             -1,
             NULL,
             0,
    NULL,
             NULL );
     pElementText = new char[iTextLen + 1];
     memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
     ::WideCharToMultiByte( CP_ACP,
             0,
             str.c_str(),
             -1,
             pElementText,
             iTextLen,
             NULL,
             NULL );
     string strText;
     strText = pElementText;
     delete[] pElementText;
     return strText;
    }
    3.  UTF-8 to Unicode
    wstring UTF8ToUnicode( const string& str )
    {
     int  len = 0;
     len = str.length();
     int  unicodeLen = ::MultiByteToWideChar( CP_UTF8,
                0,
                str.c_str(),
                -1,
                NULL,
                0 );  
     wchar_t *  pUnicode;  
     pUnicode = new  wchar_t[unicodeLen+1];  
     memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
     ::MultiByteToWideChar( CP_UTF8,
             0,
             str.c_str(),
             -1,
             (LPWSTR)pUnicode,
             unicodeLen );  
     wstring  rt;  
     rt = ( wchar_t* )pUnicode;
     delete  pUnicode;
     
     return  rt;  
    }
    4.  Unicode to UTF-8    
    string UnicodeToUTF8( const wstring& str )
    {
     char*     pElementText;
     int    iTextLen;
     // wide char to multi char
     iTextLen = WideCharToMultiByte( CP_UTF8,
             0,
             str.c_str(),
             -1,
             NULL,
             0,
             NULL,
             NULL );
     pElementText = new char[iTextLen + 1];
     memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
     ::WideCharToMultiByte( CP_UTF8,
             0,
             str.c_str(),
             -1,
             pElementText,
             iTextLen,
             NULL,
             NULL );
     string strText;
     strText = pElementText;
     delete[] pElementText;
     return strText;
    }




  • 相关阅读:
    skydriver 工具 SDExplorer
    微软出手了:Live Office与Google 文档大PK
    4§7 二次曲面的直纹性
    5§4 二次曲线的直径
    5§5 二次曲线的主直径
    AI第四章 计算智能(1)
    矩阵理论 第五讲 对角化与Jordan标准形
    矩阵理论第 四讲 矩阵的对角化
    5§7 二次曲线方程的化简与分类
    矩阵论 ppt
  • 原文地址:https://www.cnblogs.com/skyhuangdan/p/5774078.html
Copyright © 2011-2022 走看看