WideCharToMultiByte和MultiByteToWideChar函数的用法

本文详细介绍了在实际应用中如何使用WideCharToMultiByte和MultiByteToWideChar函数进行多字节与宽字节之间的相互转换,并通过代码实现展示了ANSI到Unicode、Unicode到ANSI、UTF-8到Unicode以及Unicode到UTF-8的转换过程。文章旨在帮助开发者解决编码转换过程中常见的乱码问题。

WideCharToMultiByte和MultiByteToWideChar函数的用法

为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
WideCharToMultiByte
的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar
的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACPCP_UTF8两个。
使用CP_ACP代码页就实现了ANSIUnicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8Unicode之间的转换。
下面是代码实现:
1. ANSI to Unicode

wstring ANSIToUnicode( conststring& 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值