1

我正在尝试使用 WinInet 库以 UTF-8 编码读取网页。

这是我的一些代码:

HINTERNET hUrl = ::InternetOpenUrl(hInet, wurl.c_str(),NULL,NULL,NULL,NULL);
    CHAR buffer[65536];
    std::wstring full_content;
    std::wstring read_content;
    DWORD number_of_bytes_read=1;

    while(number_of_bytes_read)
    {
        ::InternetReadFile(hUrl, buffer, 65536, &number_of_bytes_read);
    //  ::InternetReadFileExW(hUrl, &buffersw, IRF_SYNC,NULL);
            //((hUrl,buffer,65536,&number_of_bytes_read);
        read_content.resize(number_of_bytes_read);

        ::MultiByteToWideChar(CP_ACP,MB_COMPOSITE,
                     &buffer[0],number_of_bytes_read,
                     &read_content[0],number_of_bytes_read);
        full_content.append(read_content);
        //readed_content.append(buffer,number_of_bytes_read);
    }

我正确地看到了英文符号,但我看到的是垃圾而不是俄语符号。会是什么?
提前致谢。

4

3 回答 3

3

您的网页是 UTF-8,但您使用 ANSI 代码页 (CP_ACP) 对其进行解码。改用 CP_UTF8

于 2012-11-02T16:17:17.723 回答
1

根本不转换。将其 UTF-8 保存在内存中。仅在与 Windows API 函数交互时转换为 UTF-16。

http://utf8everywhere.org中有关此方法的更多信息。

于 2012-11-03T08:59:18.947 回答
1

将 CP_ACP 更改为 CP_UTF8 并将 MB_COMPOSITE 更改为 0

从文档

对于 UTF-8 或代码页 54936(GB18030,从 Windows Vista 开始),dwFlags 必须设置为 0 或 MB_ERR_INVALID_CHARS。否则,函数将失败并显示 ERROR_INVALID_FLAGS。

于 2012-11-02T16:27:20.007 回答