有关宽字符的转换

来源:互联网 发布:sky 知乎live 编辑:程序博客网 时间:2024/06/10 22:08
//为了支持Unicode编码,需要多字节与宽字节之间的相互转换。//这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,//然后重新阅读《Windows核心编程》,总结出正确的用法。//WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。//MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。//常用的代码页由CP_ACP和CP_UTF8两个。//使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。//使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。//下面是代码实现://1. ANSI to Unicodewstring 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 ANSIstring UnicodeToANSI( const wstring& str ){char* pElementText;int iTextLen;// wide char to multi chariTextLen = 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 Unicodewstring 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 chariTextLen = 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;}


原创粉丝点击