BSTR中包含了比如 :%E4%B8%93%E8%AF%91%E7%这样编码好的中文字符,直接用CString类和CComBSTR类的默认操作不行的。CString对BSTR的转换是调用WideCharToMultiByte方法,WideCharToMultiByte会把这些UTF8编码的字符转成乱码,OLE2T转换宏也不行。
我查看了一下BSTR指向的内存,发现这些字符在内存里是按 E4 00 B8 00 93 00 这样存放的。结果WideCharToMultiByte把它当成ASIIC字符来转了。这样使转成单字节后的汉字串全部错误。后续的UTF8解码也造成错误。
写个简单的转换函数如下,因为汉字在UNICODE里占了4位,所以这小段程序只能转没有包含实际汉字符的BSTR
//BSTR字串的长度
size_t wLen = wcslen( pbstr ) + 1;
//计算一下转换后的单字节字串长度
int aLen=WideCharToMultiByte(
CP_ACP,
0,
pbstr,
wLen,
NULL,
0,
NULL,
NULL);
char* psz = new char[aLen];
ZeroMemory( psz, aLen);
int nPos = 0;
//转成正确的单字节字串
for( UINT i=0; i<wLen; i++)
{
char* c = (char*)&pbstr[i];
if( c[0] == '/0' )
{
break;
}
psz[nPos] = c[0];
++nPos;
}
//UTF8解码
CString szConver = Utf8Decode(psz);
delete[] psz;