读取的网页数据中文显示乱码

goojim 2007-03-15 04:45:51
各位大虾,我在vc中用IXMLHTTPRequest读取网页数据,数据能够读取,但是中文部分全部显示乱码,请问怎么回事?(我用的是vs .net 03的环境)
...全文
1057 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
尘雨 2007-03-19
  • 打赏
  • 举报
回复
_variang_t使用安全数组来访问二进制流,注意看代码
尘雨 2007-03-19
  • 打赏
  • 举报
回复
以上代码,处理了xmlhttp得到数据的乱码问题
你的代码有很多错误
1。如果你需要显示_bstr_t,一定要强制转换
MessageBox(NULL, (LPCTSTR)bstring, _T("Results"), MB_OK);
2。如果需要把字符串字节数组转换为_bstr_t
也可以_bstr_t bstr((LPCTSTR)result)
3.你的result数组太小,返回长度达到了将近4K,我改成动态分配了

4。因为xmlhttp组件在接收到response之后,内部使用utf8强转换到responseText,所以responseText取得的数据不正确。responseBody是response的原始字节流,可以把这个字节流转换为unicode再转换为普通字符串

尘雨 2007-03-19
  • 打赏
  • 举报
回复
if(FAILED(::CoInitialize(NULL)))
return;
try
{
MSXML2::IXMLHTTPRequestPtr pIXMLHTTPRequest = NULL;
_bstr_t bstrString ;
HRESULT hr;
hr=pIXMLHTTPRequest.CreateInstance("Msxml2.XMLHTTP");
SUCCEEDED(hr) ? 0 : throw hr;


//hr=pIXMLHTTPRequest->open("GET", "http://www.8684.cn/search.php?k=pp&p=2&cid=4&q=1", false);
hr=pIXMLHTTPRequest->open("GET", "http://old.8684.cn/p/4/7e44054e.js", false);
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->send();
SUCCEEDED(hr) ? 0 : throw hr;
_variant_t vbin = pIXMLHTTPRequest->responseBody;
char * pBuf2=NULL;
//////////////////////////////////////////////////////////////////////////

if(vbin.vt == (VT_ARRAY | VT_UI1))///判断数据类型是否正确
{

SafeArrayAccessData(vbin.parray,(void **)&pBuf2);

///从Variant Binary 中得到指向数据的指针
/*****在这里我们可以对pBuf2中的数据进行处理*****/
long size=vbin.parray->rgsabound[0].cElements;

// raw bytes stream utf-8 to uniocde ,1 get size
int nwLen = MultiByteToWideChar(CP_ACP,0,pBuf2,-1,NULL,0);
TRACE("UTF8 String len:%d\n",nwLen);

LPWSTR lpw=new WCHAR[nwLen];
memset (lpw,0,(nwLen)*sizeof(WCHAR)); //make the buffer empty, use <memory.h>

TRACE("bytes:%d\n",(nwLen)*sizeof(WCHAR));

// utf-8 to uniocde ,2 convert
MultiByteToWideChar( CP_ACP, 0,pBuf2, size, lpw, nwLen );

BYTE *result=new BYTE[(nwLen)*sizeof(WCHAR)];
memset(result,0,(nwLen)*sizeof(WCHAR));
// unicode to LPSTR
WideCharToMultiByte( CP_ACP, 0,lpw, -1,(LPSTR)result, (nwLen)*sizeof(WCHAR), NULL, NULL );

printf("ANSI String[%d]=%s\n",_tcslen((LPCTSTR)result),result);
_bstr_t bstring((LPCTSTR)result);
delete[] lpw;
delete[] result;
SafeArrayUnaccessData(vbin.parray);
pIXMLHTTPRequest.Release();
MessageBox(NULL, (LPCTSTR)bstring, _T("Results"), MB_OK);


}
//////////////////////////////////////////////////////////////////////////


}
catch (_com_error pCome)
{


TRACE("Error info: %s \n", (LPCTSTR)(_bstr_t)(pCome.Description()));
TRACE("Error info: %s \n", (pCome.ErrorMessage()));

}
::CoUninitialize();
尘雨 2007-03-19
  • 打赏
  • 举报
回复
正在看...
goojim 2007-03-19
  • 打赏
  • 举报
回复
呵呵,学了很多啊。谢谢
尘雨 2007-03-19
  • 打赏
  • 举报
回复
顺便说一句,用BSTR的地方可以用_bstr_t,这样就可以省掉你释放字符串的一些代码,因为智能指针包装类可以自己release,增减引用计数和释放
goojim 2007-03-19
  • 打赏
  • 举报
回复
另外,能不能帮我解答一下这个问题:http://community.csdn.net/Expert/topic/5398/5398992.xml?temp=.528927,因为接下来就是这个问题了。
goojim 2007-03-19
  • 打赏
  • 举报
回复
非常感谢,代码没有问题了。我涉足太浅,所以有很多问题,以后还有多多向你请教啊。
goojim 2007-03-18
  • 打赏
  • 举报
回复
我用你的方法试了一下,返回值result是空的,不知道问题出哪,麻烦你帮我看看,谢了!代码如下:
void XMLHttpRequestSample()
{
IXMLHTTPRequestPtr pIXMLHTTPRequest = NULL;
BSTR bstrString = NULL;
HRESULT hr;

CoInitialize(NULL);
try
{
hr=pIXMLHTTPRequest.CreateInstance("Msxml2.XMLHTTP");
SUCCEEDED(hr) ? 0 : throw hr;


// hr=pIXMLHTTPRequest->open("GET", "http://www.8684.cn/search.php?k=pp&p=2&cid=4&q=1", false);
hr=pIXMLHTTPRequest->open("GET", "http://old.8684.cn/p/4/7e44054e.js", false);
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->send();
SUCCEEDED(hr) ? 0 : throw hr;

bstrString = pIXMLHTTPRequest->responseText;


BYTE result[256];
// utf-8 to uniocde ,1 get size
int nwLen = MultiByteToWideChar(CP_UTF8,0,(LPSTR)bstrString,-1,NULL,0);
TRACE("UTF8 String len:%d\n",nwLen);
LPWSTR lpw=new WCHAR[nwLen+1];
TRACE("sizeof(lpw):%d\n",(nwLen+1)*sizeof(WCHAR));
memset (lpw,0,(nwLen+1)*sizeof(WCHAR)); //make the buffer empty, use <memory.h>

// utf-8 to uniocde ,1 convert
MultiByteToWideChar( CP_UTF8, 0, (LPSTR)bstrString, sizeof(bstrString), (LPWSTR)lpw, nwLen );

memset(result,0,sizeof(result));
// unicode to LPSTR
WideCharToMultiByte( CP_ACP, 0,lpw, -1, (LPSTR)result, sizeof(result), NULL, NULL );

TRACE("ANSI String=%s\n",result);
delete[] lpw;

MessageBox(NULL, _bstr_t(result), _T("Results"), MB_OK);

if(bstrString)
{
::SysFreeString(bstrString);
bstrString = NULL;
}

}
catch (...)
{
MessageBox(NULL, _T("Exception occurred"), _T("Error"), MB_OK);
if(bstrString)
::SysFreeString(bstrString);
}

}
尘雨 2007-03-16
  • 打赏
  • 举报
回复
不好意思,之前的答复有些错误。

转换先从utf8 到 unicode,然后unicode到ANSI字符串
尘雨 2007-03-16
  • 打赏
  • 举报
回复
//一个中文字符串的UTF8代码,可以猜猜看
BYTE byteUTF8[]={0xE7,0x94, 0xB7, 0xE5, 0x84, 0xBF, 0xE5, 0xBD, 0x93, 0xE8, 0x87, 0xAA, 0xE5, 0xBC, 0xBA};
BYTE result[128];
// utf-8 to uniocde ,1 get size
int nwLen = MultiByteToWideChar(CP_UTF8,0,(LPSTR)byteUTF8,-1,NULL,0);
TRACE("UTF8 String len:%d\n",nwLen);
LPWSTR lpw=new WCHAR[nwLen+1];
TRACE("sizeof(lpw):%d\n",(nwLen+1)*sizeof(WCHAR));
memset (lpw,0,(nwLen+1)*sizeof(WCHAR));

// utf-8 to uniocde ,1 convert
MultiByteToWideChar( CP_UTF8, 0, (LPSTR)byteUTF8,
sizeof(byteUTF8), (LPWSTR)lpw, nwLen );

memset(result,0,sizeof(result));
// unicode to LPSTR
WideCharToMultiByte( CP_ACP, 0,lpw, -1,
(LPSTR)result, sizeof(result), NULL, NULL );

TRACE("ANSI String=%s\n",result);
delete[] lpw;
尘雨 2007-03-16
  • 打赏
  • 举报
回复
对于utf-8格式的网页和js都可以。

bstr你转换成LPSTR来处理,其实就类似于一个字节数组
goojim 2007-03-16
  • 打赏
  • 举报
回复
但我读取的是js文件不是xml文件,得到的bstrString是BSTR类型的,这种方法也适用吗?
goojim 2007-03-15
  • 打赏
  • 举报
回复
谢谢楼上的,我试了一下,代码如下:LPSTR dest = NULL; WideCharToMultiByte( CP_UTF8, 0, bstrString, -1, dest, 256, NULL, NULL );得到的dest为0(错误的指针),显示的内容为空,不知道是我dest的类型声明错了还是其他什么原因?
尘雨 2007-03-15
  • 打赏
  • 举报
回复
得到如果是UTF8,WideCharToMultiByte转一下

第一个参数用CP_UTF8
dwFlags 必须为0
且lpDefaultChar 和 lpUsedDefaultChar 必须设为NULL
goojim 2007-03-15
  • 打赏
  • 举报
回复
我读取的是js文件, 读取函数的代码如下: hr = pIXMLHTTPRequest->open("GET", "http://old.8684.cn/p/4/7e44054e.js", false);

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧