В нижеприведённом коде я пытаюсь отправить запрос к 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 видит этот запрос так:
В 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);
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей