C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译
使用C++开发一个在线翻译工具,这个想法在我大脑中过了好几遍了,所以就搜了下资料,得知网络上有很多翻译API,这里我选择我平时使用较多的有道翻译API进行在线翻译工具开发的练习。翻译API返回的结果常见的有两种:xml和json格式,本文选择使用json数据来实现Berlin版本的在线翻译工具。
开发环境:Ubuntu12.04 + GCC4.7
一、 有道翻译API
API 地址:http://fanyi.youdao.com/openapi
这里我选择了数据调用接口key的申请,填入相关信息,然后系统会提供API Key和Keyfrom字段给你,同时会发送一份包含这2项的邮件到你所填写的邮箱。
有道翻译API的数据接口如下:
http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=<doctype>&version=1.1&q=要翻译的文本
版本: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工程主页:http://curl.haxx.se/, 目前最新版本是curl-7.34.0,下载解压后进入curl-7.34.0目录,用如下命令安装:
cd $CURL_HOME
mkdir build
cd build
cmake ..
make
2.2 JsonCpp的安装
JsonCpp工程主页:http://jsoncpp.sourceforge.net/,目前的最新版本是jsoncpp-src-0.5.0,下载解压后进入jsoncpp-src-0.5.0,使用Scons进行安装,Scons是一个Python编译系统,没有安装的童鞋需要先安装Scons,如下:
sudo apt-get install scons
Scons安装好之后就可以编译JsonCpp了,使用如下命令:
scons platform=linux-gcc
好了,JsonCpp已经成功安装了,为了后面程序编译链接过程中方便,我在JsonCpp路径下的libs文件夹中设置了一个软连接,如下:
ln -s libjson_linux-gcc-.7_libmt.a libjson_linux-gcc.a
三、 在线翻译工具
直接贴代码:
/*
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 ;
int len = size*nmemb;
writerData->append(data, len);
return len;
} int main(int argc, char *argv[])
{
if(argc < )
{
usage();
exit();
}
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[];
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();
} Json::Value root;
Json::Reader reader;
bool parsingSuccessful = reader.parse(buffer, root); if (!parsingSuccessful)
{
cout << "Failed to parse the data!" << endl;
exit();
} 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[] << "\t英[" << phonetic.asString() << "]" << endl; for(int i = ; i < explains.size(); ++i)
cout << explains[i].asString() << endl; return ;
}
PS:代码中红色加粗的部分就是你所申请到的key和keyfrom字段。
CMake文件如下:
project(test)
cmake_minimum_required(VERSION 2.6) include_directories($ENV{JSONCPP_HOME}/include $ENV{CURL_HOME}/include)
link_directories($ENV{JSONCPP_HOME}/libs/ $ENV{CURL_HOME}/build/lib)
add_definitions(-std=c++0x)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") set(source
translate.cc)
add_executable(translate ${source})
target_link_libraries(translate json_linux-gcc)
target_link_libraries(translate curl)
程序执行效果如下:

=====================================================================
补充:
之前实现这个工具的时候没有考虑汉译英,所以并没有对汉语进行测试,感谢yough90提出汉语没法翻译的问题,这个问题其实很好理解,编码问题,中文和英文使用不同的编码方式,解决方案也比较简单,libcurl提供了专门用于编码的方法:
char *curl_easy_escape( CURL * curl , char * url , int length );
在我们检测到我们传入的参数有非ASCII编码的时候,我们调用该函数对其进行转换:
if ((*argv[]&0x80) != )
{
type = ;
char *encode_word = curl_easy_escape(curl, argv[], );
translate_url += encode_word;
} else {
type = ;
translate_url += argv[];
}
由于后面显示格式会有所不同,所以我加入一个type用来记住翻译类型,好了,修改后的代码如下:
#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 ;
int len = size*nmemb;
writerData->append(data, len);
return len;
} int main(int argc, char *argv[])
{
if(argc < )
{
usage();
exit();
}
string buffer;
string translate_url = "http://fanyi.youdao.com/openapi.do?keyfrom=xxxxxxxx&key=xxxxxxxx&type=data&doctype=json&version=1.1&q=";
CURL * curl;
CURLcode res;
curl = curl_easy_init(); int type; if ((*argv[]&0x80) != )
{
type = ;
char *encode_word = curl_easy_escape(curl, argv[], );
translate_url += encode_word;
} else {
type = ;
translate_url += argv[];
} 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();
} Json::Value root;
Json::Reader reader;
bool parsingSuccessful = reader.parse(buffer, root); if (!parsingSuccessful)
{
cout << "Failed to parse the data!" << endl;
exit();
} if (root["errorCode"] != )
{
cout << "errorCode: " << root["errorCode"] << endl;
exit();
}
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;
const char *prefix = type == ? "[" : "英[";
cout << argv[] << "\t" << prefix << phonetic.asString() << "]" << endl; for(int i = ; i < explains.size(); ++i)
cout << explains[i].asString() << endl; return ;
}
这里,对之前博友提出的没有验证errorCode的问题也一并修复了!汉语翻译结果如下:

谢谢大家的阅读!
语音辞典功能见这里:http://www.cnblogs.com/berlin-sun/p/OnlineDictionary.html
C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译的更多相关文章
- C++调用有道翻译API实现在线翻译之发声篇
大概半月前写了一篇博文:C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译, 得到大家的热情捧场,有人看了文章说要是能发声不是更好,我觉得说的也是哈,能听到专家的标准发音,那该是多美的 ...
- Qt学习日记篇-Qt中使用Curl和jsonCpp
1.Qt中安装并使用jsonCPP库 1.1 官网下载.https://sourceforge.net/projects/jsoncpp/ 解压文件得到 jsoncpp-src-0.5.0 文 ...
- 原生js简单调用百度翻译API实现的翻译工具
先来个在线demo: js翻译工具 或者百度搜索js简单调用百度翻译API工具(不过有个小小的界面显示bug,我想细心的人应该会发现) 或者直接前往该网址:js翻译工具 或者前往我的github:gi ...
- 调用支付宝PHP接口API实现在线即时支付功能(UTF-8编码)
这次在项目中要实现订单功能,所以要完成在线支付,在线支付一般有网银支付和第三方支付(支付宝.paypal等)这两种途径,未简单起见,先完成支付宝在线支付功能,由于项目基于Yii框架,且使用UTF-8编 ...
- php,javscript调用百地图度API实现标记
最近一个项目需要用到地图的定位和标记功能,本来考虑使用google map API .但是在国内这个速度确实很慢,有时候加载到一半就出现错了,不过可以通过google agent 来解决在国内的访问速 ...
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
- asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文
近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的 ...
- PHP中使用CURL请求页面,使用fiddler进行抓包
在PHP中使用CURL访问页面: <?php $ch = curl_init('http://www.baidu.com'); curl_setopt($ch, CURLOPT_RETURNTR ...
- WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常
WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...
随机推荐
- Java异常之RuntimeException
人生不如意十有八九.在打Core Java里面的例子的时候总是一遍就过,但是实际上只要是自己想着动手去打造自己想要的东西,异常的状况也是十有八九的. 在Java中会使用异常处理的错误捕获机制处理这些异 ...
- Cocos2d-x——导入Cocostudio资源
(搬运自我在SegmentFault的博客) 目前正在和实训的小组成员一起做一款手机2D游戏,我们采用了Cocos2d-x进行开发.之前虽然早有耳闻,这次却是第一次认真地学习和使用Cocos2d-x. ...
- python_93_面向对象实例2
class Role: def __init__(self,name,role,weapon,life_value=100,money=15000): '构造函数:实例化时做一些类的初始化工作' se ...
- SC || Git 相关知识
发现大佬的博客:https://www.cnblogs.com/onetwo/p/4157610.html 注:图片来自小姐姐的笔记~ ┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉┉┉┉∞ ∞┉┉┉┉∞ ...
- SQL数据库中各种字段类型的说明
(1)char.varchar.text和nchar.nvarchar.ntext char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是 ...
- C++ 学习笔记(四)类的内存分配及this指针
类,是使用C++的最主要的内容.如果将c++与C语言做比较,我感觉类更像是结构体的加强进化版.在刚接触C++不久的时候总是让类,对象,this指针弄得一脸懵逼,我对类有比较清楚的认识是从理解类在内存中 ...
- WCF_基础学习
1.https://www.cnblogs.com/swjian/p/8126202.html 2.https://www.cnblogs.com/dotnet261010/p/7407444.htm ...
- 私有DockerHub搭建
docker简介 一个开源的应用容器引擎,可以用来打包程序,可以包入依赖环境,这样只需要提供docker image即可,类似于虚拟机,但是更轻量级. 几个概念: Paas,platform as a ...
- COMP9021--6.17
1. ''' '''the comment in the middle will be shown in your code while ranning 2. a=bc=a%bor we can si ...
- optimize table在优化mysql时很重要
一个表的数据量有1000W条,那么查看这么表占据的硬盘空间时会发现,数据本身是300M,索引是200M 这个时候,删除掉500W条数据,这个时候数据本身150M,而索引还是200M左右 你删除数据时, ...