C++ 使用HttpRequest获取网页及UTF8转GB码

简介: C++ 使用HttpRequest获取网页及UTF8转GB码
#include <iostream>
#include <windows.h>
#include <wininet.h>
using namespace std;
string HttpRequest(string strUrl, string strMethod="GET", string strPostData="", int nPostDataLen=0, short sPort=80)
{
  int pos;
  BOOL bRet;
  char *lpHostName, *lpUrl, *lpMethod, *lpPostData;
  string tmpUrl, strResponse = "";
  while ((pos = strUrl.find(" ")) != strUrl.npos) strUrl.erase(pos, 1); //删除网址中的空格 
  if (strUrl.substr(0,7) == "http://") strUrl=strUrl.substr(7, strUrl.size()-1); //删除网址中的协议名 
  if (strUrl.substr(0,8) == "https://") strUrl=strUrl.substr(8, strUrl.size()-1);
  if (strUrl.empty()) return strResponse;
  if ((pos=strUrl.find("/")) != strUrl.npos){
    tmpUrl = strUrl.substr(pos+1, strUrl.size()-1);
    strUrl = strUrl.substr(0, pos);
  } else tmpUrl = "/";
  lpUrl = (char*)tmpUrl.data();
  lpMethod = (char*)strMethod.data();
  lpHostName = (char*)strUrl.data();
  lpPostData = (char*)strPostData.data();
  HINTERNET hInternet, hConnect, hRequest;
  hInternet = hConnect = hRequest = NULL;
  hInternet = (HINSTANCE)InternetOpen("User-Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  if (!hInternet) return strResponse;
  hConnect = (HINSTANCE)InternetConnect(hInternet, lpHostName, sPort, NULL, "HTTP/1.1", INTERNET_SERVICE_HTTP, 0, 0);
  if (!hConnect){
    if (hInternet) InternetCloseHandle(hInternet);
    return strResponse;
  }
  hRequest = (HINSTANCE)HttpOpenRequest(hConnect, lpMethod, lpUrl, "HTTP/1.1", NULL, NULL, INTERNET_FLAG_RELOAD, 0);
  if (!hRequest){
    if (hInternet) InternetCloseHandle(hInternet);
    if (hConnect) InternetCloseHandle(hConnect);
    return strResponse;
  }
  bRet = HttpSendRequest(hRequest, NULL, 0, lpPostData, nPostDataLen);
  while (true){
    char cReadBuffer[4096];
    unsigned long lNumberOfBytesRead;
    bRet = InternetReadFile(hRequest, cReadBuffer, sizeof(cReadBuffer)-1, &lNumberOfBytesRead);
    if (!bRet || !lNumberOfBytesRead) break;
    cReadBuffer[lNumberOfBytesRead] = 0;
    strResponse = strResponse + cReadBuffer;
  }
  if (hRequest) InternetCloseHandle(hRequest);
  if (hConnect) InternetCloseHandle(hConnect);
  if (hInternet) InternetCloseHandle(hInternet);
  return strResponse;
}
string UTF8toGB(string s)
{
  WCHAR *strSrc;
  LPSTR szRes;
  char *str = (char*)s.data();
  int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
  strSrc = new WCHAR[i+1];
  MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);
  i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
  szRes = new CHAR[i+1];
  WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
  s = szRes;
  delete[]strSrc;
  delete[]szRes;
  return s;
}
int main(void)
{
  string utf = "<meta charset=\"utf-8\">";
  string url = "https://blog.csdn.net/boysoft2002/article/details/113839813";
    string Html = HttpRequest(url);
  if (Html.find(utf)!=Html.npos)
    cout << UTF8toGB(Html);
  else
    cout << Html;
    return 0;
}


20210219212425972.png

如使用vs系列编译器请using namespace std;之前插入:#pragma comment(lib,"WinInet.lib")

目录
相关文章
|
Web App开发 测试技术 PHP
C++ 与 php 的交互 之----- C++ 获取 网页文字内容,获取 php 的 echo 值。
转载请声明出处! http://www.cnblogs.com/linguanh/category/633252.html       距离上次 谈 C++ 制作json 或者其他数据传送给 服务器,时隔两个多月。
1302 0
|
Web App开发 PHP C++
C++ 与 php 的交互 之----- C++ 异步获取 网页文字内容,异步获取 php 的 echo 值。
已搬迁至 http://www.cnblogs.com/linguanh/p/4543836.html如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力、 ...
864 0
|
C++ 编译器 JavaScript
C++ vs.net设置UTF8字符
1、将main.cpp改成utf-8编码,方法是点击main.cpp,然后选择菜单文件->高级保存选项。【所有源码都要转换成uft-8】 2、在你的main函数里,设置如下代码,完美解决qt5的中文乱码 MSC_VER是MSVC编译器的内置宏,定义了编译器的版本。
1096 0
|
C++
Visual C++ unicode and utf8 转换
ATL宏: USES_CONVERSION; W2A A2W   CString StringUtil::UTF8_to_UNICODE(const char *utf8_string, int length){    int wcsLen = ::MultiByteToWideChar(...
931 0
|
C++
c++ ANSI、UNICODE、UTF8互转
static std::wstring MBytesToWString(const char* lpcszString);    static std::string WStringToMBytes(const wchar_t* lpwcszWString);    static std::...
1314 0
win C/C++程序通过Get方式获取网页源代码
[转自]http://www.cnblogs.com/coderzh/archive/2008/11/24/1340134.html 1 #include 2 #include 3 #include 4 5 #define MAXSIZE 1024 6 #pragma comment(lib, "Wininet.
913 0
|
7天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
21 2
|
13天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
40 5
|
19天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
49 4