转自: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函数的用法(转)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。