Преобразование строки из многобайтовых символов в широкоформатные дает неожиданные результаты

Я пытаюсь прочитать веб-страницу в кодировке UTF-8 с помощью библиотеки WinInet.

Вот часть моего кода:

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

Я правильно вижу английские символы, но вместо русских символов я вижу мусор. Что это может быть?
Заранее спасибо.

1

Решение

Ваша веб-страница имеет формат UTF-8, и все же вы декодируете ее, используя кодовую страницу ANSI (CP_ACP). Вместо этого используйте CP_UTF8

3

Другие решения

Измените 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 в памяти. Конвертировать в UTF-16 только при взаимодействии с функциями Windows API.

Подробнее об этом подходе в http://utf8everywhere.org.

1
По вопросам рекламы [email protected]