我试过用三种方法去读取,碰到utf-8的网页,得到的中文全是乱码。以前用java和c#做过类似的功能,在java中通过转换流的编码,c#通过改http头都可以解决乱码问题。但在c++中似乎都不管用,求适合的解决方案。
最好能通过设置http请求使得到的直接就是正确的内容,这样省效率。
如果不行,那就用转换编码的方式把得到的乱码转成正确的中文。
下面给出用过的三种方法,给大家做个参考。试过用socket,但成功率不理想,所以都是用http请求的方式。
1 用Wininet的Internet系列函数
#include <iostream>
#include <stdio.h>
#include <string>
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <stdlib.h>
#pragma comment(lib, "Wininet.lib")
using namespace std;
……
string* html=new string;
HINTERNET hSession = InternetOpen(_T("UrlTest"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hSession != NULL){
HINTERNET hHttp = InternetOpenUrl(hSession, _T("http://www.moko.cc"), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if (hHttp != NULL){
//wprintf_s(_T("%s\n"), url);
t_char Temp[MAXSIZE];
ULONG Number = 1;
while (Number > 0){
InternetReadFile(hHttp, Temp, MAXSIZE - 1, &Number);
Temp[Number] = '\0';
*html=*html+Temp;
}
InternetCloseHandle(hHttp);
hHttp = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}
cout<<*html;
delete html;
这种方法无法改http头,但应该可以通过转码实现。
2 用Wininet的Request系列函数
#include <iostream>
#include <stdio.h>
#include <string>
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <stdlib.h>
#pragma comment(lib, "Wininet.lib")
using namespace std;
……
HINTERNET hSession = InternetOpen("MSDN SurfBear",PRE_CONFIG_INTERNET_ACCESS,NULL,INTERNET_INVALID_PORT_NUMBER,0) ;
HINTERNET hConnect = InternetConnect(hSession,"www.moko.cc",INTERNET_INVALID_PORT_NUMBER,"","",INTERNET_SERVICE_HTTP,0,0) ;
HINTERNET hHttpFile = HttpOpenRequest(hConnect, "GET","/",HTTP_VERSION,NULL,0,INTERNET_FLAG_DONT_CACHE,0) ;
PCHAR g_Accept_Encoding = "Accept-Encoding:utf-8\r\n";
HttpAddRequestHeaders(hHttpFile, g_Accept_Encoding, (DWORD)strlen(g_Accept_Encoding),HTTP_ADDREQ_FLAG_ADD & HTTP_ADDREQ_FLAG_REPLACE);
BOOL bSendRequest = HttpSendRequest(hHttpFile, NULL, 0, 0, 0);
char bufQuery[320] ;
DWORD dwLengthBufQuery = sizeof(bufQuery);
BOOL bQuery = HttpQueryInfo(hHttpFile, HTTP_QUERY_CONTENT_LENGTH, bufQuery, &dwLengthBufQuery,0) ;
DWORD dwFileSize = (DWORD)atol(bufQuery) ;
char* buffer = new char[dwFileSize+1] ;
DWORD dwBytesRead=0 ;
BOOL bRead=InternetReadFile(hHttpFile, buffer, dwFileSize+1, &dwBytesRead);
while (dwBytesRead > 0){
InternetReadFile(hHttpFile, buffer, dwFileSize + 1, &dwBytesRead);
buffer[dwBytesRead] = '\0';
cout<<buffer;
}
InternetCloseHandle(hHttpFile);
InternetCloseHandle(hConnect) ;
InternetCloseHandle(hSession) ;
这种方可以改http头,似乎也可以转码。
3 用libcurl
#include <iostream>
#include <stdio.h>
#include <string>
#include <windows.h>
#include <tchar.h>
#include "include/curl/curl.h"
#include <stdlib.h>
#pragma comment(lib, "libcurl_imp.lib")
……
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
struct curl_slist *headers=NULL;
headers = curl_slist_append(headers, "Accept-Encoding:utf-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "FireFox");
curl_easy_setopt(curl, CURLOPT_URL,"www.moko.cc");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
用libcrul也可以改http头,不知是否能将得到的内容转码。而且以我目前对它的了解,libcurl只能将得到的内容输出到控制台,不能赋值给变量
为什么我浏览网页的时候字体是乱码
1. 修改浏览器编码设置:在浏览器的设置中,找到编码选项,将编码设置为UTF-8或者GB2312等常用编码格式。2. 检查网页编码:有些网页在编写时可能使用了非常规的编码方式,导致浏览器无法正常解析。可以尝试切换到“开发者工具”或“源代码”模式下查看网页的编码方式,如果发现错误,就需要联系网站管理员...
网页出现乱码怎么办
打开“控制面板”找到“区域和语言选项”。打开后可能是别的国家语言和区域位置。接下来选择“小三角”选择“中文(中国)”。然后在点击“位置”下面的“小三角”也选为“中国”。选择完成后再按“确定”即可。系统出现这种乱码难题,一般有可能是自己动来动去,把区域语言给弄乱了,或者安装了别的语言的...
网站乱码的问题怎么解决?
若页面显示仍未恢复正常,可以尝试清除浏览器缓存并重启浏览器,或更换其他浏览器访问网站,看是否仍然存在乱码问题。另外,检查网站源代码,确认其是否使用了正确的编码格式。有时网站开发者在发布网站时,会忘记正确设置编码,导致显示乱码。这时,联系网站管理员并提供编码设置建议,通常能有效解决问题。在某...
html网页乱码怎么修改
html网页乱码修改的方法是:1、html网页源代码编码与中文字输入编码不同。解决方法:使用软件进行编辑HTML网页内容,推荐使用DW软件进行HTML代码编辑和开发。尽量不要直接使用记事本进行编辑HTML代码。2、如果网页设置编码是gbk的,而数据库储存数据编码格式是UTF-8的,这个时候程序查询数据库数据显示数据前进乡...
网页出现乱码有什么解决办法? - 知乎
解决步骤:检查编码设置是否匹配,更改编码以解决不匹配问题。确保文件格式正确,避免格式错误导致乱码。检查并调整字符集设置,确保与浏览器兼容。对于损坏文件,尝试重新获取或下载。若问题持续,检查网页源代码和文件完整性,或联系网站管理员寻求专业帮助。确定编码方式的方法是查看HTML元标签,查找指定编码...
为什么电脑上打开网页总会出现乱码
电脑上打开网页总会出现乱码,可能是由多种原因导致的。首先,字符编码不匹配是常见的原因之一,即网页使用的字符编码与浏览器设置的字符编码不一致。这可能是由于网页源代码的编码格式(如GBK)与浏览器默认或当前设置的编码格式(如UTF-8)不同。其次,缺少字符编码声明也可能导致乱码问题。如果网页HTML...
易语言 http读文件() 怎么读出来的网页源码是乱码呀
原因是:操作错误导致的,具体解决方法步骤如下:1.首先打开电脑,在电脑中运行“易语言”主程序,弹出“新建项目对话框”,选择“Windows窗口程序”,点击“确定”,进入“Windows窗口编程界面”。2.接下来,拖放一个标签组件、两个编辑框组件、一个按钮组件和一个分组框组件。将它们放置在适当的位置,并...
易语言 http读文件() 怎么读出来的网页源码是乱码呀
易语言 http读文件() 读出来的网页源码是乱码的原因是操作错误导致的,具体解决方法步骤如下:1、首先打开计算机,在计算机内运行“易语言”主程序,弹出“新建工程对话框”选择“Windows窗口程序”然后点击“确定”按钮,进入“Windows窗口程序设计界面”。2、接下来,拖放标签组件一个、编辑框组件两个、...
电脑网页显示乱码_电脑网页乱码怎么回事
看看网页右键源代码看看具体原因,再设置。实在不行远程帮调试。8. 电脑打开网页乱码1、如果我们是利用记事本打开文件出现的乱码,则需要安装与文件相对应的程序才能解决问题。其中最重要的文件格式是doc或docx文件,其对应的程序为Microsoft Office Word程序。2、当Word或其它与文件对应的程序已安装,但双击打开文件时无法...
为什么有时候或出现乱码
有时候在浏览网页时,会遇到乱码问题。这种情况在不同浏览器中表现各异。首先,我们来关注IE浏览器。当问题出现在IE中时,解决办法通常较为直接。通过执行“查看”菜单下的“编码”选项,用户可以尝试更改网页的显示编码格式。选择适合的文字编码,如UTF-8或GBK,可以有效解决乱码问题。然而,当浏览器并非...