转自:http://www.cnblogs.com/gakusei/articles/1585211.html
为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
下面是代码实现:
1. ANSI to Unicode
1 // ANSI to Unicode
2 #include <
string>
3 using namespace std;
4 wstring ANSIToUnicode(
const string&
str )
5 {
6 int len =
0;
7 len =
str.length();
8 // 返回转换后unicode的长度
9 int unicodeLen =
::MultiByteToWideChar(
10 CP_ACP,
// 实现ANSI与Unicode之间的转换
11 0,
//
12 str.c_str(),
// 转码前的数据
13 -
1,
14 NULL,
15 0 );
16 // 申请内存
17 wchar_t *
pUnicode;
18 pUnicode =
new wchar_t[unicodeLen+
1];
19 // 初始化申请的内存
20 memset(pUnicode,
0,(unicodeLen+
1)*
sizeof(wchar_t));
21 ::MultiByteToWideChar(
22 CP_ACP,
23 0,
24 str.c_str(),
// 转换前数据
25 -
1,
26 (LPWSTR)pUnicode,
// 转换后数据
27 unicodeLen );
// 转换长度
28 wstring rt;
29 rt = ( wchar_t*
)pUnicode;
30 delete pUnicode;
// 删除申请的内存
31
32 return rt;
33 }
2. Unicode to ANSI
// Unicode To ANSI
string 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 Unicode
//UTF8 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
// Unicode To UTF8
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;
}
总结
以上是生活随笔为你收集整理的WideCharToMultiByte和MultiByteToWideChar函数的用法(转)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。