Прежде всего, извините за мой плохой английский.
Я сделал свое исследование, но нет никаких связанных ответов, чтобы решить мою проблему.
Я понял и узнал о CodePages Utf 8 и других вещах в c или c ++,
а также знаю, что строки могут содержать utf8.
Моя машина для разработки winxp english с кодовой страницей консоли установлена на 1254 (windows turkish), и я могу использовать расширенные турецкие символы (İığşçüö) в std :: string, считать их и отправлять в mysqlpp api для записи dbs. Нет проблем. Но когда я хочу использовать curl, чтобы извлечь html и записать его в std :: string, моя проблема начинается.
#include <iostream>
#include <windows.h>
#include <wincon.h>
#include <curl.h>
#include <string>
int main()
{
SetConsoleCP(1254);
SetConsoleOutputCP(1254);
std::string s;
std::cin>>s;
std::cout<<s<<std::endl;
return 0;
}
Когда я запускаю их и набираю ğşçöüİı, вывод такой же, как ;şçöüİı;
#include <iostream>
#include <windows.h>
#include <wincon.h>
#include <curl.h>
#include <string.h>
size_t writer(char *data, size_t size, size_t nmemb, std::string *buffer);
{
int res;
if(buffer!=NULL)
{
buffer->append(data,size*nmemb);
res=size*nmemb;
}
return res;
}
int main()
{
SetConsoleOutputCP(1254);
std::string html;
CURL *curl;
CURLcode result;
curl=curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://site.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html);
result=curl_easy_perform(curl);
if(result==CURLE_OK)
{
std::cout<<html<<std::endl;
}
}
return 0;
}
Когда я компилирую и запускаю;
если html содержит 'ı' распечатывает в cmd 'Ä ±', 'ö' печатает 'Ķ', 'ğ' выводит 'ÄŸ', 'İ' печатает 'Ä˚' и т. Д.
если я изменю кодовую страницу на 65000,
...
SetConsoleOutputCP(65000);//For utf8
...
Тогда результат такой же, так что причина проблемы - не cmd CodePage.
Ответные заголовки http указывают, что кодировка установлена в utf-8, а метаданные html такие же.
Как я понял, источником проблемы является сама функция "писатель" или "завиток". Поступающие данные анализируются на символы, такие расширенные символы, как ı, İ, ğ, анализируются на 2 символа и записываются в массив символов std :: string таким образом, таким образом кодовая страница, эквивалентная этим половинным символам, распечатывается или используется где-либо в коде (например, mysqlpp для записи эта строка в БД).
Я не знаю, как решить это или что делать в функции писателя или где-либо еще.
Я правильно думаю? Если так, что я могу сделать с этой проблемой? Или источник проблемы в другом месте?
Я использую mingw32 Windows Xp 32bit Code :: Blocks ide.