C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译

更新时间:2023-07-07 11:01:39 阅读: 评论:0

C++中使⽤Curl和JsonCpp调⽤有道翻译API实现在线翻译
使⽤C++开发⼀个在线翻译⼯具,这个想法在我⼤脑中过了好⼏遍了,所以就搜了下资料,得知⽹络上有很多翻译API,这⾥我选择我平时使⽤较多的有道翻译API进⾏在线翻译⼯具开发的练习。翻译API返回的结果常见的有两种:xml和json格式,本⽂选择使⽤json数据来实现Berlin版本的在线翻译⼯具。
开发环境:Ubuntu12.04 + GCC4.7
⼀、有道翻译API
API 地址:
这⾥我选择了数据调⽤接⼝key的申请,填⼊相关信息,然后系统会提供API Key和Keyfrom字段给你,同时会发送⼀份包含这2项的邮件到你所填写的邮箱。
有道翻译API的数据接⼝如下:
版本:1.1,请求⽅式:get,编码⽅式:utf-8
主要功能:中英互译,同时获得有道翻译结果和有道词典结果(可能没有)
参数说明:
 type - 返回结果的类型,固定为data
 doctype - 返回结果的数据格式,xml或json或jsonp
 version - 版本,当前最新版本为1.1
 q - 要翻译的⽂本,不能超过200个字符,需要使⽤utf-8编码
errorCode:
 0 - 正常
 20 - 要翻译的⽂本过长
 30 - ⽆法进⾏有效的翻译
 40 - 不⽀持的语⾔类型
 50 - ⽆效的key
⼆、 Curl和JsonCpp的安装
2.1 Curl的安装
Curl⼯程主页:,⽬前最新版本是curl-7.34.0,下载解压后进⼊curl-7.34.0⽬录,⽤如下命令安装:
1 cd $CURL_HOME
2mkdir build
3 cd build
4 cmake ..
5make
2.2 JsonCpp的安装
JsonCpp⼯程主页:,⽬前的最新版本是jsoncpp-src-0.5.0,下载解压后进⼊jsoncpp-src-0.5.0,使⽤Scons进⾏安装,Scons是⼀个Python 编译系统,没有安装的童鞋需要先安装Scons,如下:
1sudo apt-get install scons
Scons安装好之后就可以编译JsonCpp了,使⽤如下命令:
南京夫子庙旅游攻略
1 scons platform=linux-gcc
好了,JsonCpp已经成功安装了,为了后⾯程序编译链接过程中⽅便,我在JsonCpp路径下的libs⽂件夹中设置了⼀个软连接,如下:
1ln -s libjson_linux-gcc-4.7_libmt.a libjson_linux-gcc.a
三、在线翻译⼯具
直接贴代码:
则为之计深远
1/*
2    Filename: translate
3    Author: BerlinSun
4*/
5 #include <iostream>
6 #include "curl/curl.h"
7 #include "json/json.h"
8
9using namespace std;
10
11void usage()
12 {
13    cout << "Usage: translate word_you_want_to_translate" << endl;
14 }
15
16int writer(char *data, size_t size, size_t nmemb, string *writerData)
17 {
18if (writerData == NULL)
19return0;
20int len = size*nmemb;
21    writerData->append(data, len);
22return len;
23 }
24
25int main(int argc, char *argv[])
26 {
27if(argc < 2)
28    {
29        usage();
30        exit(0);
31    }
32string buffer;
33string translate_url = "/openapi.do?keyfrom=xxxxxx&key=xxxxxx&type=data&doctype=json&version=1.1&q=";
34    translate_url += argv[1];
35    CURL * curl;
36    CURLcode res;
37    curl = curl_easy_init();
38if (curl)
39    {
40        curl_easy_topt(curl, CURLOPT_URL, translate_url.c_str());
41        curl_easy_topt(curl, CURLOPT_WRITEFUNCTION, writer);
42        curl_easy_topt(curl, CURLOPT_WRITEDATA, &buffer);
43        res = curl_easy_perform(curl);
44        curl_easy_cleanup(curl);
45    }
46if (pty())
47    {
48        cout << "The rver return NULL!" << endl;
49        exit(0);
50    }
51
52    Json::Value root;
53    Json::Reader reader;
54bool parsingSuccessful = reader.par(buffer, root);
55
56if (!parsingSuccessful)
57    {
58        cout << "Failed to par the data!" << endl;
59        exit(0);
60    }
61
62const Json::Value basic = root["basic"];
63const Json::Value phonetic = basic["phonetic"];
64const Json::Value explains = basic["explains"];
65    cout << "Provided by Youdao dictionary!" << endl;
66    cout << "-----------------------------" << endl;
67    cout << argv[1] << "\t英[" << phonetic.asString()  << "]" << endl;
68
69for(int i = 0; i < explains.size(); ++i)
70        cout << explains[i].asString() << endl;
71
72return0;
73 }
View Code
PS:代码中红⾊加粗的部分就是你所申请到的key和keyfrom字段。
CMake⽂件如下:
1 project(test)
2 cmake_minimum_required(VERSION 2.6)
4 include_directories($ENV{JSONCPP_HOME}/include $ENV{CURL_HOME}/include)
5 link_directories($ENV{JSONCPP_HOME}/libs/ $ENV{CURL_HOME}/build/lib)
6 add_definitions(-std=c++0x)
红薯蛋挞7 t(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
8
9 t(source
10    translate)
11 add_executable(translate ${source})
12 target_link_libraries(translate json_linux-gcc)
13 target_link_libraries(translate curl)
程序执⾏效果如下:
=====================================================================
补充:
成都必去的10个景点
之前实现这个⼯具的时候没有考虑汉译英,所以并没有对汉语进⾏测试,感谢提出汉语没法翻译的问题,这个问题其实很好理解,编码问题,中⽂和英⽂使⽤不同的编码⽅式,解决⽅案也⽐较简单,libcurl提供了专门⽤于编码的⽅法:
1char *curl_easy_escape( CURL * curl , char * url , int length );
在我们检测到我们传⼊的参数有⾮ASCII编码的时候,我们调⽤该函数对其进⾏转换:
1if ((*argv[1]&0x80) != 0)
动物性别2 {
3    type = 0;
4char *encode_word = curl_easy_escape(curl, argv[1], 0);
5    translate_url += encode_word;
6 } el {
7    type = 1;
8  translate_url += argv[1];
9 }
由于后⾯显⽰格式会有所不同,所以我加⼊⼀个type⽤来记住翻译类型,好了,修改后的代码如下:
1 #include <iostream>
2 #include "curl/curl.h"
3 #include "json/json.h"
4
5using namespace std;
6
7void usage()
8 {
9    cout << "Usage: translate word_you_want_to_translate" << endl;
10 }
11
12int writer(char *data, size_t size, size_t nmemb, string *writerData)
13 {
14if (writerData == NULL)
15return0;
16int len = size*nmemb;
17    writerData->append(data, len);
18return len;
19 }
20
21int main(int argc, char *argv[])
22 {
23if(argc < 2)
24    {
25        usage();
26        exit(0);
27    }
28string buffer;动名词做主语的用法
29string translate_url = "/openapi.do?keyfrom=xxxxxxxx&key=xxxxxxxx&type=data&doctype=json&version=1.1&q=";
30    CURL * curl;
31    CURLcode res;
32    curl = curl_easy_init();
33
34int type;
35
36if ((*argv[1]&0x80) != 0)
37    {
38        type = 0;
39char *encode_word = curl_easy_escape(curl, argv[1], 0);
40        translate_url += encode_word;
41    } el {
42        type = 1;
43        translate_url += argv[1];
44    }
46if (curl)
47    {
48        curl_easy_topt(curl, CURLOPT_URL, translate_url.c_str());
49        curl_easy_topt(curl, CURLOPT_WRITEFUNCTION, writer);
50        curl_easy_topt(curl, CURLOPT_WRITEDATA, &buffer);
51        res = curl_easy_perform(curl);
52        curl_easy_cleanup(curl);
53    }
54if (pty())
55    {
56        cout << "The rver return NULL!" << endl;
57        exit(0);
58    }
59
60    Json::Value root;
61    Json::Reader reader;
62bool parsingSuccessful = reader.par(buffer, root);
63
64if (!parsingSuccessful)
65    {
66        cout << "Failed to par the data!" << endl;
67        exit(0);
68    }
69
70if (root["errorCode"] != 0)
71    {
72        cout << "errorCode: " << root["errorCode"] << endl;
73        exit(0);
74    }
75const Json::Value basic = root["basic"];
阿芙罗狄忒76const Json::Value phonetic = basic["phonetic"];
77const Json::Value explains = basic["explains"];
78    cout << "Provided by Youdao dictionary!" << endl;
79    cout << "-----------------------------" << endl;
80const char *prefix = type == 0 ? "[" : "英[";
81    cout << argv[1] << "\t" << prefix << phonetic.asString()  << "]" << endl;
82
83for(int i = 0; i < explains.size(); ++i)
84        cout << explains[i].asString() << endl;
85
86return0;
87 }
这⾥,对之前博友提出的没有验证errorCode的问题也⼀并修复了!汉语翻译结果如下:谢谢⼤家的阅读!
语⾳辞典功能见这⾥:
>谛听的拼音

本文发布于:2023-07-07 11:01:39,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1083516.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:翻译   没有   结果
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图