C / C ++: libcurl + расширенные символы ASCII = плохой результат API перевода Google - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь использовать Google Translation API с libcurl в моей программе на C / C ++, но получаю плохой результат всякий раз, когда что-то переводю с расширенным ASCII.Например, перевод «nuß» на английский (немецкое слово «nut»).Обратите внимание, что ß является расширенным символом ASCII (0xDF), вам не нужен Unicode для его записи.

"nuß" → английский в Chrome

Когда я открываю этот URL в Chrome, онуспешно переводится как «гайка»: https://translate.googleapis.com/translate_a/single?client=gtx&ie=UTF-8&oe=UTF-8&sl=de&tl=en&dt=t&q=nuß

[[["nut","nuß",null,null,2]],null,"de"

«nuß» → английский в моей программе C / C ++

Когда я использую тот же URL из моей программы C / C ++, оношибочно переводится в «nu?»

[[["nu?","nu?",null,null,0]],null,"de"

Вот моя программа:

#include <iostream>
#define CURL_STATICLIB
#include "curl/curl.h"

int main() {
    CURL *curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://translate.googleapis.com/translate_a/single?client=gtx&ie=UTF-8&oe=UTF-8&sl=de&tl=en&dt=t&q=nuß");
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return 0;
}

То же самое происходит, если я изменяю конец URL на nu%DF вместо nuß.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Я понял, мне нужно было закодировать ß как %C3%9F. Я делал «кодирование знака процента» с кодом ASCII для ß (%DF), тогда как мне нужно было использовать для него код UTF-8.

0 голосов
/ 11 марта 2019

Вы пытались сделать curl_easy_escape ? Если у вас установлен набор символов, отличных от ascii, вероятно, лучше сначала экранировать строку. Обратите внимание, что это не заботится о кодировке символов (в вашем случае utf8). Поэтому вам нужно сначала преобразовать кодировку, используя некоторые стандартные способы , например, для C ++ или iconv для C / C ++.

...