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的问题也⼀并修复了!汉语翻译结果如下:谢谢⼤家的阅读!
语⾳辞典功能见这⾥:
>谛听的拼音