1

WinInetライブラリを使用してUTF-8エンコーディングでWebページを読み込もうとしています。

これが私のコードの一部です:

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

WebページはUTF-8ですが、ANSIコードページ(CP_ACP)を使用してデコードします。代わりにCP_UTF8を使用してください

于 2012-11-02T16:17:17.723 に答える
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 に答える
1

変換しないでください。UTF-8をメモリに保持します。Windows API関数と対話する場合にのみ、UTF-16に変換します。

このアプローチの詳細については、http://utf8everywhere.orgをご覧ください。

于 2012-11-03T08:59:18.947 に答える