WinHTTP以unicode请求数据?

时间:2014-02-01 20:35:48

标签: c++ html unicode winhttp

我正在尝试通过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?有什么不同?我在哪里困惑?

1 个答案:

答案 0 :(得分:1)

HTTP是二进制传输,它没有文本或Unicode的概念。 HTTP对HTTP标头使用7位ASCII,但内容是任意二进制数据,其解释依赖于描述它的HTTP标头,最明显的是Content-Type标头。因此,您需要先将原始内容数据接收到char[]缓冲区,然后使用WinHttpQueryHeaders()查看收到的Content-Type标头,以查看您收到的数据类型。如果它表示您收到了text/...类型,那么标题通常也会指定文本的charset。对于text/htmlcharset可能位于HTML本身内的<meta>标记中,而不是HTTP标头中。知道文本的charset后,您可以使用MultiByteToWideChar()将其转换为wchar_t[](您必须手动查找字符集的相应代码页)。