现在的位置: 首页 > 综合 > 正文

WideCharToMultiByte和MultiByteToWideChar函数的用法

2017年11月26日 ⁄ 综合 ⁄ 共 2874字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.