社区
HTML/XML
帖子详情
读取的网页数据中文显示乱码
goojim
2007-03-15 04:45:51
各位大虾,我在vc中用IXMLHTTPRequest读取网页数据,数据能够读取,但是中文部分全部显示乱码,请问怎么回事?(我用的是vs .net 03的环境)
...全文
1056
16
打赏
收藏
读取的网页数据中文显示乱码
各位大虾,我在vc中用IXMLHTTPRequest读取网页数据,数据能够读取,但是中文部分全部显示乱码,请问怎么回事?(我用的是vs .net 03的环境)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
网页
获取JSON
中文
返回
乱码
解决方案(java + js)
解决所有双字节字符串json返回
乱码
问题,返回
数据
如果已html形式
显示
,无需做任何处理,如果是在alert中,或在文本框中,用附带的js中的方法处理一下即可。
PHP
读取
mssql json
数据
中文
乱码
的解决办法
PHP及
网页
使用UTF-8编码,
数据
库是sql server2008,使用默认编码,当
读取
数据
库
数据
时,使用php自带的json_encode()返回到...下面脚本之家小编给大家介绍PHP
读取
mssql json
数据
中文
乱码
的解决办法,需要的朋友一起学习
AIGC-通过搜索引擎使大模型实时获取最新
数据
大模型已经越来越深入到工作和生活中了,但因为计算资源、训练时间等原因,大模型没有办法获取实时的
数据
,比如GTP-4,
数据
的截止日期为:2023 年 4 月 如果我们想要获取 2023年4月之后的信息或者
数据
,GPT是没有...
网页
语言编码及asp
乱码
问题解决方案
乱码
出现的原因 由于各个字符编码的储存空间不一样,所以当使用不同的字符
读取
数据
时,当字符空间过小,就不能正常
显示
了。 比如说
中文
字符的字符集一般是gb2312,如果用utf-8强制
读取
改变gb2312的字符,就有可能...
jquery+ajax无刷新评论源码
客户端用escape()函数编码含
中文
的字符串,服务器端用unescape()解码,这样做是为了防止
乱码
,如果你采用的是utf8, 那就不必了,设置正确的页面编码和服务端脚本编码就不会出问题。由于jquery默认使用utf8传输
数据
...
HTML/XML
3,055
社区成员
8,066
社区内容
发帖
与我相关
我的任务
HTML/XML
VC/MFC HTML/XML
复制链接
扫一扫
分享
社区描述
VC/MFC HTML/XML
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章