2012-11-02 44 views
1

我正在嘗試使用WinInet庫以UTF-8編碼讀取網頁。將多字節字符串轉換爲widechar's會產生意想不到的結果

下面是我的一些代碼:

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); 
    } 

我正確地看英文符號,但不是俄羅斯的符號我看到一個垃圾桶。它會是什麼?
在此先感謝。

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384322%28v=vs.85%29.aspx –

回答

3

您的網頁是UTF-8,但您可以使用ANSI代碼頁(CP_ACP)對其進行解碼。使用CP_UTF8代替

+0

我試過了,但它返回空字符串。我想我需要調用GetLastError來看看究竟發生了什麼。 – PaulD

+0

MB_COMPOSITE是問題,請閱讀文檔。 – john

+0

我終於找到了一個正確的標誌,它是MB_ERR_INVALID_CHARS。它正確地轉換俄羅斯符號。謝謝! – PaulD

1

變化CP_ACP到CP_UTF8和MB_COMPOSITE 0

從文檔

爲UTF-8或代碼54936頁(GB18030,與Windows Vista開始),dwFlags中必須設置爲0或MB_ERR_INVALID_CHARS。否則,該函數將失敗,並顯示ERROR_INVALID_FLAGS。

1

根本不轉換。在內存中保存UTF-8。僅在與Windows API函數交互時轉換爲UTF-16。

有關此方法的更多信息,請參閱http://utf8everywhere.org

相關問題