LINUX.ORG.RU

libcurl кракозябры

 ,


0

1

Если в урл многобайтовые символы, то возвращается мусор.

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

size_t write_data(char *data, size_t size, size_t nmemb, char *buffer){
        strcpy(buffer, data);
        return  size * nmemb;
}

int main(){
    CURL *curl = curl_easy_init();
    char buffer[512];
    char url[] = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=привет";
    if(curl){
        CURLcode res;
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        res = curl_easy_perform(curl);
    }
    printf("%s\n", buffer);
}

Результат:
[[["Ð¿Ñ € ивÐμÑ,","привет",null,null,0]],null,"is",null,null,null,1,null,[["is"],null,[1],["is"]]]

А наоборот нормально: [[["Здравствуйте","hello",null,null,1]],null,"en",null,null,null,1,null,[["en"],null,[1],["en"]]]

Пробовал урл через curl_easy_escape пропускать, но что-то разницы нет.


Кодировка пути в урле не специфицирована. Так что это должно быть обоюдное понимание между сервером и клиентом.

Судя по выводу сервер хочет Latin1, а ты шлёшь UTF-8.

Да и вообще хардкодить в исходниках что-то отличное от базового набора символов чревато такого рода поведением, что может усложнить отладку.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от Bfgeshka

Пробовал уже. К стати если в урл auto заменить на ru, то возвращает cp1251 и очевидно без перевода, не знаю правда что это дает.

[[["РїСЂРёРІРμС,","привет",null,null,3]],null,"ru"]

anmg
() автор топика

Попробуй с curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0");

anonymous
()

потенциальный сегфолт в программе: если curl == NULL, то может выйти за пределы буффера на printf

not_rj45
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.