翻译演示翻译中文失败,可能是编码失败

Translate demo failed to translate Chinese, maybe the encode failure?

本文关键字:翻译 失败 编码 中文      更新时间:2023-10-16

最近,我实现了一个在线翻译演示,是的,当一个尝试将一个英文单词翻译成中文时,它运行良好,但不幸的是,它未能将一个中文单词翻译成英文。

我想这个问题可能是中文的编码引起的,我尝试打印网址,并将它们复制到IE,IE返回的结果是正确的。

代码如下:

/*
Filename: translate.cc
Author: BerlinSun
*/
#include <iostream>
#include "curl/curl.h"
#include "json/json.h"
using namespace std;
void usage()
{
    cout << "Usage: translate word_you_want_to_translate" << endl;
}
int writer(char *data, size_t size, size_t nmemb, string *writerData)
{
    if (writerData == NULL)
        return 0;
    int len = size*nmemb;
    writerData->append(data, len); 
    return len;
}
int main(int argc, char *argv[])
{
    if(argc < 2)
    {
        usage();
        exit(0);
    }
    string buffer;
    string translate_url = "http://fanyi.youdao.com/openapi.do?keyfrom=xxxxxx&key=xxxxxx&type=data&doctype=json&version=1.1&q=";
    translate_url += argv[1];
    CURL * curl;
    CURLcode res;
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, translate_url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }
    if (buffer.empty())
    {
        cout << "The server return NULL!" << endl;
        exit(0);
    }
    Json::Value root;
    Json::Reader reader;
    bool parsingSuccessful = reader.parse(buffer, root);
    if (!parsingSuccessful)
    {
        cout << "Failed to parse the data!" << endl;
        exit(0);
    }
    const Json::Value basic = root["basic"];
    const Json::Value phonetic = basic["phonetic"];
    const Json::Value explains = basic["explains"];
    cout << "Provided by Youdao dictionary!" << endl;
    cout << "-----------------------------" << endl;
    cout << argv[1] << "t英[" << phonetic.asString()  << "]" << endl;
    for(int i = 0; i < explains.size(); ++i)
        cout << explains[i].asString() << endl;
    return 0;
}

这个问题已经自己解决了,我检查了 libcurl 的手稿,发现这是一个可以用来编码 url 的函数:

char *curl_easy_escape( CURL * curl , char * url , int length );

我修改了我的源代码来判断 argv[1],如果 argv[1] 是非 assic,那么我会使用转换的这个函数。

谢谢大家。