std::string存储的utf-8格式xml指令如何转换成普通的string

sinmeng 2009-08-12 08:35:37
utf-8格式的xml指令,存储在标准的std::string中,怎么把这个string转化成普通的多字节的string


utf-8编码中汉字是3个字节或以上的,普通的多字节不是这样表示的....
...全文
518 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
[Quote=引用 4 楼 sinmeng 的回复:]
呃MultiBytesToWideChar还能把UTF-8转化成unicode么,我还真的不知道...
我只知道这个东西是用来转换多字节到宽字符的...
[/Quote]
参数 CodePage 有以下几种
CP_ACP ANSI code page
CP_MACCP Macintosh code page
CP_OEMCP OEM code page
CP_SYMBOL Windows 2000/XP: Symbol code page (42)
CP_THREAD_ACP Windows 2000/XP: The current thread's ANSI code page
CP_UTF7 Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-7
CP_UTF8 Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-8.
平常你使用的是CP_ACP
回复
healer_kx 2009-08-13
?
回复
healer_kx 2009-08-12

healer_kxinline std::string KS_UTF8_to_ANSI (const char* szUTF8)
{
if (szUTF8 == NULL)
return "" ;

int nLen = ::MultiByteToWideChar (CP_UTF8, 0, szUTF8, -1, NULL, 0) ;
WCHAR * pWstr = new WCHAR[nLen+1] ;
ZeroMemory (pWstr, sizeof(WCHAR) * (nLen+1)) ;
::MultiByteToWideChar (CP_UTF8, 0, szUTF8, -1, pWstr, nLen) ;
std::string strAnsi (_bstr_t((wchar_t*)pWstr)) ;
delete[] pWstr ;
return strAnsi ;
}

inline char* KS_ANSI_to_UTF8 (const char* szAnsi)
{
if (szAnsi == NULL)
return NULL ;

_bstr_t bstrTmp (szAnsi) ;
int nLen = ::WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)bstrTmp, -1, NULL, 0, NULL, NULL) ;
char * pUTF8 = new char[nLen+1] ;
ZeroMemory (pUTF8, nLen + 1) ;
::WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)bstrTmp, -1, pUTF8, nLen, NULL, NULL) ;
return pUTF8 ;
}


回复
oyljerry 2009-08-12
[Quote=引用 4 楼 sinmeng 的回复:]
呃MultiBytesToWideChar还能把UTF-8转化成unicode么,我还真的不知道...
我只知道这个东西是用来转换多字节到宽字符的...
[/Quote]
附录:CPP程序utf82unicode.cpp
#include <stdio.h>
#include <string.h>

// UTF-8的unicode表示方法到unicode的值转换函数
bool utf82unicode(unsigned int byte[], int index, int count, int& unicode)
{
/* for (int i=index; i < count; ++i) {
printf("byte[%d]:%0Xn",i, byte[i]);
}
printf("byte[index] & 0x80: %0Xn", byte[index] & 0x80);
printf("byte[index] & 0xE0: %0Xn", byte[index] & 0xE0);
printf("byte[index] & 0xF0: %0Xn", byte[index] & 0xF0);
*/
if (index >= count) return false;
if ( (byte[index] & 0x80) == 0x0) // 一位
{
unicode = byte[index];
}
else if ((byte[index] & 0xE0) == 0xC0) // 两位
{
if (index + 1 >= count ) return false;
unicode = (((int)(byte[index] & 0x1F)) << 6)
| (byte[ index + 1] & 0x3F);
}
else if ((byte[index] & 0xF0) == 0xE0) // 三位
{
if (index + 2 >= count) return false;
unicode = (((int)(byte[index] & 0x0F)) << 12)
| (((int)(byte[index + 1] & 0x3F)) << 6)
| (byte[index + 2] & 0x3F);
}
else if ((byte[index] & 0xF8) == 0xF0) // 四位
{
if (index + 3 >= count) return false;
unicode = (((int)(byte[index] & 0x07)) << 18)
| (((int)(byte[index + 1] & 0x3F)) << 12)
| (((int)(byte[index + 2] & 0x3F)) << 6)
| (byte[index + 3] & 0x3F);
}
else if ((byte[index] & 0xFC) == 0xF8) // 五位
{
if (index + 4 >= count) return false;
unicode = (((int)(byte[index] & 0x03)) << 24)
| (((int)(byte[index + 1] & 0x3F)) << 18)
| (((int)(byte[index + 2] & 0x3F)) << 12)
| (((int)(byte[index + 3] & 0x3F)) << 6)
| (byte[index + 4] & 0x3F);
}
else if ((byte[index] & 0xFE) == 0xFC) // 六位
{
if (index + 5 >= count) return false;
unicode = (((int)(byte[index] & 0x01)) << 30)
| (((int)(byte[index + 1] & 0x3F)) << 24)
| (((int)(byte[index + 2] & 0x3F)) << 18)
| (((int)(byte[index + 3] & 0x3F)) << 12)
| (((int)(byte[index + 4] & 0x3F)) << 6)
| (byte[index + 5] & 0x3F);
}
else
{
return false;
}
return true;

}

然后unicode到多字节
回复
healer_kx 2009-08-12
我给你一段代码吧,
回复
sinmeng 2009-08-12
呃MultiBytesToWideChar还能把UTF-8转化成unicode么,我还真的不知道...
我只知道这个东西是用来转换多字节到宽字符的...
回复
healer_kx 2009-08-12
WideCharToMultiBytes
MultiBytesToWideChar
要学会用~
回复
bohut 2009-08-12
Unicode和UTF-8之间的转换详解
http://www.cnblogs.com/xdotnet/archive/2007/11/23/unicode_and_utf8.html
回复
zqlong_sunday 2009-08-12
用MultiByteToWideChar,将UTF-8转换成unicode
然后再利用WideCharToMultiByte转换成ASCII
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告