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;
}

 

posted @ 2014-02-12 11:38  r3call  阅读(366)  评论(0编辑  收藏  举报