c ++使用wininet获取网页

c++ fetching web page using wininet

我正在尝试使用 WinInet 下载网页。我使用了这里给出的代码:http://www.cplusplus.com/forum/windows/109799/

大部分情况下都有效,但似乎存在一些我不知道如何解决的编码问题。

例如,这一行(使用 www.whosebug.com 作为示例页面):

<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Shared/stacks.css?v=48511da708b8">

作为此行返回:

<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Shared/stacks.css?cks.css?ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌðA6÷v=48511da708b8">

(为了不发垃圾邮件,我实际上已经删除了大部分特殊字符)

在此代码中:

while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
{
    cout << DataReceived;
}

DataReceived 正在接收任意字节。它不是 null-terminated 字符串,但代码将它传递给需要 null-terminated 字符串的 operator<< 重载。所以打印超出了接收数据的末尾,从周围的内存中打印字节,直到遇到随机 0x00 字节。

改用 istream::write() 方法,这样您就可以准确地告诉它要打印多少个字符:

cout.write(DataReceived, NumberOfBytesRead);