WideCharToMultiByte和MultiByteToWideChar函数的用法

Posted xiaochunzao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WideCharToMultiByte和MultiByteToWideChar函数的用法相关的知识,希望对你有一定的参考价值。

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

不用ansi C

char m_szFile[260];
     int len = WideCharToMultiByte(CP_ACP, 0, m_strFilePath, m_strFilePath.GetLength(), NULL, 0, NULL, NULL);
     char * pFileName = new char[len + 1];
     WideCharToMultiByte(CP_ACP, 0, m_strFilePath, m_strFilePath.GetLength() + 1, pFileName, len + 1, NULL, NULL);
     pFileName[len] = '\\0';
     delete[] pFileName;
改写的
LPCSTR UnicodeToANSI(CString &str)

	char*  pElementText;
	int    iTextLen;
	iTextLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
	pElementText = new char[iTextLen + 1];
	memset((void*)pElementText, 0, sizeof(char)* (iTextLen + 1));
	::WideCharToMultiByte(CP_ACP, 0, str, -1, pElementText, iTextLen, NULL, NULL);
	LPCSTR strText;
	strText = pElementText;
	delete[] pElementText;
	return strText;

CString ANSIToUnicode(const LPCSTR& str)

	int  len = 0;
	len = strlen( str);
	int  unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, 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, -1, (LPWSTR)pUnicode, unicodeLen);
	CString  rt;
	rt = (wchar_t*)pUnicode;
	delete  pUnicode;
	return  rt;


以上是关于WideCharToMultiByte和MultiByteToWideChar函数的用法的主要内容,如果未能解决你的问题,请参考以下文章

WideCharToMultiByte和MultiByteToWideChar函数的用法

ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数

MultiByteToWideChar 和 WideCharToMultiByte 用法详解

你如何正确使用 WideCharToMultiByte

为啥我在使用 WideCharToMultiByte 时得到错误的字符数组?

请问如何用C语言实现汉字,和Unicode编码的转换?