В нижеприведённом коде в строку responseString приходит слово состоящее из кириллических символов в кодировке UTF-8. При выводе в cmd с кодовой страницей chcp 866, вместо нужного слова в консоли можно увидеть только ╨Ю╨╗╨╡╨│ . В чём здесь проблема?
Подключен шрифт Lucida Console, а при смене кодовой страницы на 65001 никакие символы не выводятся.
Если эту строку сразу же отправить в Гугл через cURL, то он без проблем поймёт что это за слово.
size_t WriteCallback(void *ptr, size_t size, size_t nmemb, string*userdata)
{
userdata->append((char *)ptr, size * nmemb);
return size * nmemb;
}
int main()
{
string responseString;
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "https://...");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseString);
system("chcp 866");
cout << responseString << endl;
curl_easy_cleanup(curl);
return 0;
}
Универсальный декодер без проблем смог определить исходную кодировку и само слово:
Рабочий способ. Нашёл insolor. Первоисточник.
int main()
{
// Волшебная палочка, которая позволяет выводить UTF-8 в консоль. Пока не разобрался, как это работает
SetConsoleOutputCP(CP_UTF8);
setvbuf(stdout, nullptr, _IOFBF, 1000);
string responseString;
//Получаю кириллицу в кодировке UTF-8
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "https://...");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseString);
cout << responseString << endl;
curl_easy_cleanup(curl);
return 0;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей