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

     1 // ANSI to Unicode
     2 #include <string>
     3 using namespace std;
     4 wstring ANSIToUnicode( const string& str )
     5 {
     6     int  len = 0;
     7     len = str.length();
     8     // 返回转换后unicode的长度
     9     int  unicodeLen = ::MultiByteToWideChar( 
    10         CP_ACP,            // 实现ANSI与Unicode之间的转换
    11         0,                // 
    12         str.c_str(),    // 转码前的数据
    13         -1,
    14         NULL,
    15         0 );
    16     // 申请内存
    17     wchar_t *  pUnicode;
    18     pUnicode = new  wchar_t[unicodeLen+1];  
    19     // 初始化申请的内存
    20     memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
    21     ::MultiByteToWideChar( 
    22         CP_ACP,
    23         0,
    24         str.c_str(),        // 转换前数据
    25         -1,
    26         (LPWSTR)pUnicode,    // 转换后数据
    27         unicodeLen );        // 转换长度
    28     wstring  rt;
    29     rt = ( wchar_t* )pUnicode;
    30     delete  pUnicode;        // 删除申请的内存
    31 
    32     return  rt;  
    33 }


    2.  Unicode to ANSI

    // 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

    //UTF8 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    

    // Unicode To UTF8
    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;
    }
  • 相关阅读:
    (转)sysbench部署与参数详解
    (转)MySQL自带的性能压力测试工具mysqlslap详解
    (转)mysql双机热备的实现
    (转)linux运维必会MySQL企业面试题
    (转)MySQL出现同步延迟有哪些原因?如何解决?
    (转)mysql数据库高可用高扩展性架构方案实施
    java.IO
    String类的编码和解码问题
    编码表的概述和常见编码表
    05_打字游戏
  • 原文地址:https://www.cnblogs.com/tk091/p/3545667.html
Copyright © 2011-2022 走看看