我正在尝试通过WinHTTP阅读网页:
bool WinHTTPClass::QueryResponseData(std::string &query_data)
{
// Read response
DWORD dwSize, dwDownloaded = 0;
do
{
// Check for available data.
if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) )
{
cout << "Error querying data : " << GetLastError() << endl;
return false;
}
// Allocate space for the buffer.
char* pszOutBuffer = new char[dwSize+1];
if( !pszOutBuffer )
{
cout << "Out of memory" << endl;
dwSize=0;
}
else
{
// Read the data.
ZeroMemory( pszOutBuffer, dwSize+1 );
if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded ) )
{
cout << "Error reading data : " << GetLastError() << endl;
return false;
}
else
{
query_data += pszOutBuffer;
}
// Free the memory allocated to the buffer.
delete [] pszOutBuffer;
}
}
while( dwSize > 0 );
return true;
}
这一切都运作良好。我在这里遇到的困惑是我应该使用unicode编码缓冲区而不是:
来处理缓冲区数据char* pszOutBuffer = new char[dwSize+1];
通过使用wchar_t
而不是网页通常使用UTF8?有什么不同?我在哪里困惑?
答案 0 :(得分:1)
HTTP是二进制传输,它没有文本或Unicode的概念。 HTTP对HTTP标头使用7位ASCII,但内容是任意二进制数据,其解释依赖于描述它的HTTP标头,最明显的是Content-Type
标头。因此,您需要先将原始内容数据接收到char[]
缓冲区,然后使用WinHttpQueryHeaders()
查看收到的Content-Type
标头,以查看您收到的数据类型。如果它表示您收到了text/...
类型,那么标题通常也会指定文本的charset
。对于text/html
,charset
可能位于HTML本身内的<meta>
标记中,而不是HTTP标头中。知道文本的charset
后,您可以使用MultiByteToWideChar()
将其转换为wchar_t[]
(您必须手动查找字符集的相应代码页)。