Передача кириллицы чрез cURL (C++)

222
05 мая 2018, 16:38

В нижеприведённом коде я пытаюсь отправить запрос к GoogleSearchAPI через cURL. Строка запроса (url) содержит кириллические символы, которые при отправке непонятно как кодируются, и ни Fiddler ни GoogleAPI не могут понять что это. Как бороться с такой проблемой?

#include <string>
#include <Windows.h>
#include <clocale>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
    CURL *curl = curl_easy_init();
    string question = "привет";
    string url = "https://www.googleapis.com/customsearch/v1?q=" + question;
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_PROXY, "http://192.167.1.106:8888/");
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    return 0;
}

Fiddler видит этот запрос так:

Answer 1

В url допустим лишь ограниченный набор символов (a-z, A-Z, 0-9, -, ., _, ~), все остальные символы должны быть закодированы т.н. url-encoding кодировкой. Для этого можно использовать функцию curl_easy_escape.

Далее, сервис который будет парсить url на той стороне, должен понимать кодировку в которой изначально был текст. Обычно сервис ожидает какую-то конкретную кодировку. И скорее всего, это будет UTF-8. У вас же текст в Windows-1251. Соответственно, предварительно вам нужно перекодировать текст в utf-8.

#include <locale>
#include <codecvt>
std::string to_utf8(const std::wstring &str)
{
    static std::wstring_convert<std::codecvt_utf8<wchar_t>> u8;
    return u8.to_bytes(str);
}
string s = to_utf8(L"привет");
char *question = curl_easy_escape(curl, s.c_str(), 0);
if (question) {
  ...
  curl_free(question);
} 
READ ALSO
Необработанное исключение по адресу [требует правки]

Необработанное исключение по адресу [требует правки]

Подскажите, что может выбить такое исключение?

233
Потоки QThread, передача данных,

Потоки QThread, передача данных,

у меня много вопросов по поводу QThread и потоковУ меня есть класс ClassData, который в конструкторе принимает два массива данных, затем передает...

267
Linux segmentation fault не на всех пользователях

Linux segmentation fault не на всех пользователях

На VDS лежит самописная программка (на С++), при запуске исполняемого бинарника из под root - работает корректноСтоит зайти за другого пользователя...

214
Реализация БПФ на с++ из Mathcad

Реализация БПФ на с++ из Mathcad

Пытаюсь реализовать БПФ из Mathcad в проекте на Qt c++ Неполучается интерпретировать данную формулу

289