• WideCharToMultiByte和MultiByteToWideChar函数的用法


    转载:http://www.cnblogs.com/gakusei/articles/1585211.html

    为了支持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;
    }

  • 相关阅读:
    java excel转pdf 工具类
    java word转pdf 工具类
    如何向数据库中添加TIMESTAMP(6)类型的数据
    IE浏览器 div或者其他容器的height属性无效 滚动条问题解决办法
    ComboBox赋值ItemsSource数据源的时候会触发SelectionChanged改变事件的解决办法
    devexpress chart 散点图加载并分组显示(可以自定义颜色 同组中的点颜色相同)
    myEclipse mybatis自动生成工具xml配置
    MySQL日志简介
    存储引擎简介
    索引介绍
  • 原文地址:https://www.cnblogs.com/cappuccino/p/2843519.html
Copyright © 2020-2023  润新知