C++ curl получить utf-8 в кирилице

171
07 марта 2019, 21:30

Есть документ в интернете в UTF-8

Пытаюсь получить его в UTF-8 с помощю curl

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
  ((std::wstring*)userp)->append((wchar_t*)contents, size * nmemb);
  return size * nmemb;
}
...
CURL *curl;
CURLcode res;
std::wstring readBuffer;
curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "url");
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
  res = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}
int pos = readBuffer.find_first_of(L"World");

breakpoint на readBuffer

и pos

Почему я не получаю в UTF-8 то что нужно?

Answer 1

Вариант для windows. Так как часто приходилось сталкиваться с кодировками, предлагаю попробовать "решение в лоб", т.е. я вижу, что в формате юникод wchar_t хранятся данные в формате UTF-8. Можно преобразовать их в char и обратно в юникод. Не самое лучшее решение (некоторые символы, т.е. всё что верх но не кирилица - будут потеряны).

if(curl) { /*...*/ }  // чисто показать после какого куска вписать код
int utf8_len = readBuffer.length();
char * tmp = (char*)malloc(utf8_len+1);// просим место    
utf8_len  = WideCharToMultiByte(CP_UTF8, 0,readBuffer.c_str(), utf8_len , tmp , utf8_len , 0, 0);
tmp[utf8_len]=0;
wchar_t * wtmp = (wchar_t*)malloc(utf8_len*2+2);
wsprintfW(wtmp,L"%hs",tmp); // Всё, получили стандартный юникод
readBuffer.assign(wtmp); // присвоить результат
// ну и всё освободить
free((void*)tmp);
free((void*)wtmp);

Другие варианты решения:

  • В ADO есть преобразователь
  • Поискать инфу по преобразованию кодировок
  • Можно просто преобразовать wchar в char циклом, и взять ф-цию MultiByteToWideChar вместо WideCharToMultiByte, но не пробовал... http://msdn.microsoft.com/en-us/magazine/mt763237.aspx
  • возможно это Нужен пример использования g_convert()

Попробуйте такое решение

int utf8_len = readBuffer.length();
char * tmp = (char*)malloc(utf8_len+1);// просим место    
for (int i=0;i<utf8_len;i++) tmp[i]=(char)readBuffer[i];
wchar_t * wtmp = (wchar_t*)malloc(utf8_len*2+2);    
utf8_len  = MultiByteToWideChar (
   CP_UTF8, 0,tmp,utf8_len, wtmp , utf8_len );
wtmp[utf8_len]=0;
readBuffer.assign(wtmp); // присвоить результат    
free((void*)tmp);
free((void*)wtmp);
READ ALSO
переопределение метода qcombobox setText

переопределение метода qcombobox setText

Переопределил стандартный view у QComboBox по этому примеру:

143
could not initialize proxy - no Session REST запрос на Update

could not initialize proxy - no Session REST запрос на Update

Суть проблеми в том что у меня есть две модели, при одной модели Edit работаеш хорошо но когда добавил вторую модель с таким же функционалом...

169
Как лучше сделать смену разметок на одном экране?

Как лучше сделать смену разметок на одном экране?

На основном экране есть "шапка" с навигацией, которая будет одинаковой (headxml)

125
Как узнать id view в AdapterView.OnItemClickListener

Как узнать id view в AdapterView.OnItemClickListener

У меня есть несколько AutoCompleteTextViewИ класс в котором они находятся реализует интерфейс AdapterView

123