首页 > 代码库 > WideCharToMultiByte和MultiByteToWideChar函数的用法
WideCharToMultiByte和MultiByteToWideChar函数的用法
为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
下面是代码实现:
1. ANSI to Unicode
1 wstring ANSIToUnicode( const string& str ) 2 { 3 int len = 0; 4 len = str.length(); 5 int unicodeLen = ::MultiByteToWideChar( CP_ACP, 6 0, 7 str.c_str(), 8 -1, 9 NULL,10 0 ); 11 wchar_t * pUnicode; 12 pUnicode = new wchar_t[unicodeLen+1]; 13 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 14 ::MultiByteToWideChar( CP_ACP,15 0,16 str.c_str(),17 -1,18 (LPWSTR)pUnicode,19 unicodeLen ); 20 wstring rt; 21 rt = ( wchar_t* )pUnicode;22 delete pUnicode;23 24 return rt; 25 }
2. Unicode to ANSI
1 string UnicodeToANSI( const wstring& str ) 2 { 3 char* pElementText; 4 int iTextLen; 5 // wide char to multi char 6 iTextLen = WideCharToMultiByte( CP_ACP, 7 0, 8 str.c_str(), 9 -1,10 NULL,11 0,12 NULL,13 NULL );14 pElementText = new char[iTextLen + 1];15 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );16 ::WideCharToMultiByte( CP_ACP,17 0,18 str.c_str(),19 -1,20 pElementText,21 iTextLen,22 NULL,23 NULL );24 string strText;25 strText = pElementText;26 delete[] pElementText;27 return strText;28 }
3. UTF-8 to Unicode
1 wstring UTF8ToUnicode( const string& str ) 2 { 3 int len = 0; 4 len = str.length(); 5 int unicodeLen = ::MultiByteToWideChar( CP_UTF8, 6 0, 7 str.c_str(), 8 -1, 9 NULL,10 0 ); 11 wchar_t * pUnicode; 12 pUnicode = new wchar_t[unicodeLen+1]; 13 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 14 ::MultiByteToWideChar( CP_UTF8,15 0,16 str.c_str(),17 -1,18 (LPWSTR)pUnicode,19 unicodeLen ); 20 wstring rt; 21 rt = ( wchar_t* )pUnicode;22 delete pUnicode;23 24 return rt; 25 }
4. Unicode to UTF-8
1 string UnicodeToUTF8( const wstring& str ) 2 { 3 char* pElementText; 4 int iTextLen; 5 // wide char to multi char 6 iTextLen = WideCharToMultiByte( CP_UTF8, 7 0, 8 str.c_str(), 9 -1,10 NULL,11 0,12 NULL,13 NULL );14 pElementText = new char[iTextLen + 1];15 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );16 ::WideCharToMultiByte( CP_UTF8,17 0,18 str.c_str(),19 -1,20 pElementText,21 iTextLen,22 NULL,23 NULL );24 string strText;25 strText = pElementText;26 delete[] pElementText;27 return strText;28 }
WideCharToMultiByte和MultiByteToWideChar函数的用法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。