您的位置:首页 > 其它

Wince 字符转换(WideCharToMultiByte和MultiByteToWideChar)方法

2013-06-12 23:38 483 查看
Wince开发的时候经常需要做编码转换,特别是做串口通信的时候,ASNI和宽字符编码转换经常做。下面是常用的转换方法,个人开发经验来说[b]ASNI和宽字符编码的转换是最常用的。[/b]

[b]做串口通信的时候还经常需要看16进制的编码来确定是什么字符编码。所以对ASNI和宽字符编码规则也要有一定了解,这方面后面再专门写一个帖子来说明。现在先来说明常用的字符转换方法:[/b]

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐