搜狗云输入法移植到linux平台的想法
在ubuntu9.04的时代,自带的输入法一直认为不够好用,看到了搜狗的云输入法,故产生了移植的想法。
通过chrome的inspect Element功能,我发现了搜狗、百度、QQ云输入法的接口。公布一下,供大家参考。
百度http://olime.baidu.com/py?py=bit&rn=0&pn=5
搜狗http://web.pinyin.sogou.com/api/py?key=938cdfe9e1e39f8dd5da428b1a6a69cb&query=bit
QQhttp://ime.qq.com/fcgi-bin/getword?key=f56b884eebd87625cb4f87fcf125b0db&cb=window.QQWebIME.callback238&q=y
写了一段百度的测试了一下,之后只用正则表达式就好了,因为后来看到google code上面有人开发了基于ibus的搜狗的云输入法,故决定停止开发吧。
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <netdb.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <fcntl.h>
- #include <sys/time.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include<iconv.h>
- #define MaxRecvLen 255
- //定义网站结构
- struct DOMAIN
- {
- char url[255]; //完整网址
- char host[20]; //主机地址
- int port; //sock 联接的端口号
- };
- typedef struct DOMAIN domain;
- //*********************gb2312toutf-8****************
- int gb2312toutf8(char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen)
- {
- iconv_t cd;
- if( (cd = iconv_open("utf-8","gb2312")) ==0 )
- return -1;
- memset(destbuf,0,destlen);
- char **source = &sourcebuf;
- char **dest = &destbuf;
- if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))
- return -1;
- iconv_close(cd);
- return 0;
- }
- //***********************百度云输入法**************************
- char* Getword(domain web_domain)
- {
- //******************* 有关 sock 的变量 *************************
- int sock_id; //sock 联接句柄
- struct hostent *hostbyname; //主机的信息 结构
- struct sockaddr_in remote_addr; //包含远端主机IP地址和端口号的结构
- //******************* 有关 无阻塞 select 所用到 的变量 *************
- struct timeval timeout; //用于无阻塞 select 调用 的时间变量
- fd_set sockid_readable; //sock 类似联接句柄 传递给 select 有效的连接
- char send_str[255]; //保存要发送的字符串
- char temp[2048];
- char result[512];
- char word[2048];
- char *recBuf; //临时字串,接收到的字串指针
- int recv_numb; //保存远端返回的字串大小
- timeout.tv_sec = 10; //设置几秒钟超时
- timeout.tv_usec = 5000; //设置几微秒超时
- //******************* 处理命令行的参数 *************************
- hostbyname = gethostbyname(web_domain.host); //将基本名字和地址转换
- if((sock_id=socket(PF_INET,SOCK_STREAM,0))==-1)
- {
- perror("socket");
- exit(1);
- }
- //初始化远端要传递的socket
- remote_addr.sin_family=AF_INET; //地址族
- remote_addr.sin_port=htons(web_domain.port); //端口号
- remote_addr.sin_addr=*((struct in_addr *)hostbyname->h_addr); //IP地址
- bzero(&(remote_addr.sin_zero),8); //填充0 以保持与struct sockaddr同样大小
- //和服务器建立连接
- if(connect(sock_id,(struct sockaddr *)&remote_addr,sizeof(remote_addr))==-1)
- {
- perror("connect");
- exit(1);
- }
- //printf("\n\nconnected %s:%d ok!\n\n",web_domain.host,web_domain.port);
- //创建要发送给远端的字串
- sprintf(send_str,"GET %s HTTP/1.1\nAccept: */*\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\nHost: %s\n\n",web_domain.url,web_domain.host);
- //printf("%s\n\n",send_str);
- //开始向服务器发送数据
- if(send(sock_id,send_str,strlen(send_str),0)==-1)
- {
- perror("send");
- exit(1);
- }
- recBuf=(char *)malloc(MaxRecvLen); //为储存远端返回的字串的变量申请空间
- while(1)
- {
- //设置无堵塞模式
- FD_ZERO(&sockid_readable);
- FD_SET(sock_id,&sockid_readable);
- select(sock_id+1, &sockid_readable, NULL, NULL, &timeout);
- if (!FD_ISSET(sock_id, &sockid_readable))
- {
- printf("Timed out.\n");
- //break;
- }
- recv_numb = recv(sock_id,recBuf,MaxRecvLen,0); //得到远端返回的字串
- recBuf[recv_numb]='\0';
- gb2312toutf8(recBuf,strlen(recBuf),result,512);
- strcat(temp,result);
- if(recv_numb<1) //返回的长度不够退出循环
- {
- break;
- }
- }
- //printf("\n\nrecv ok!\n\n");
- close(sock_id);
- strcpy(word,temp+190);
- return word;
- }
- int main(int argc,char *argv[])
- {
- char tempStr[255],*temp;
- domain web_domain; //定义一个 web domain 的结构
- strcpy(tempStr,"http://olime.baidu.com/py?pn=10&py=");
- strcat(tempStr,argv[1]);
- strcat(tempStr,"&rn=");
- strcat(tempStr,argv[2]);
- strcpy(web_domain.url,tempStr);
- strcpy(web_domain.host,web_domain.url+7);
- //处理 host
- if((temp=strstr(web_domain.host,"/")))
- {
- *temp='\0'; //web_domain.host 里去除:后的东西
- }
- if((temp=strstr(web_domain.host,":")))
- {
- *temp='\0'; //Host 里去除:后的东西
- web_domain.port=atoi(tempStr+1); //改写端口
- }
- else
- {
- web_domain.port=80;
- }
- //printf("%s\n%d\n%s\n",web_domain.host,web_domain.port,web_domain.url);
- printf("%s\n",Getword(web_domain));
- return 0;
- }
本文出自 “天才鸟蛋” 博客,请务必保留此出处http://curley.blog.51cto.com/1627940/449044
搜狗云输入法移植到linux平台的想法相关推荐
- oracle10g数据库复制,windows 下oracle 10G 数据库移植到 linux平台 (通过文件直接复制方法)...
windows 下oracle 10G 数据库移植到 linux平台 (通过文件直接复制方法) 最近学习了一下oracle数据库启动原理,于是,就把在windows创建起来做测试的数据库 移植到li ...
- lua脚本移植到linux平台,如何将lua移植到arm平台的linux内核
将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的 ...
- windows开发的qt项目移植到linux平台
关键字:qt.linux.window.Qserialport 0 前言 接触这个任务之前,完全qt小白,大大小小的坑踩了不少. 1 环境与配置 qt5.12.12 ubuntu20.04 基于st ...
- wwise移植到linux平台,设立Wwise项目 - Lumberyard 用户指南
本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 设立Wwise项目 的 Audio Controls Editor 在中查找Wwise项目文件 lumberyard_ve ...
- Windows远程桌面实现之十 - 把xdisp_virt项目移植到iOS,macOS,linux平台(一)
by fanxiushu 2019-12-06 转载或引用请注明原始作者. xdisp_virt项目到目前为止,持续了两年多时间,几乎都是在windows平台下的实现各种功能, 因为持续时间比较长,能 ...
- 云输入法+linux,搜狗云输入法在Ubuntu下的表现
搜狗云输入法在Ubuntu下的表现 转自:搜狗云输入法在Ubuntu下的表现 搜狗云输入法一经发布就引起叻广泛的关注,在我所订阅的几个博客上也是在第一时间有了体验报告,譬如HanBing 的搜狗云输入 ...
- android 短信ril移植,将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现...
摘要:本文通过对Android RIL层代码分析,将android RIL层功能在纯LINUX平台上实现,完全脱离了Android系统.为基于LINUX的通用平台实现一套成熟的RIL层代码,并开发出相 ...
- 搜狗云输入法For Linux桌面,不局限于浏览器内使用! #输入法 #iBus #搜狗
当前 搜狗云输入法只是一款概念产品,适用于特点场合临时适用,不具备普遍适用性和可用性(只能在浏览器中适用,只支持纯文本框). 通过搜狗云输入法的理念和原理,在Linux系统桌面已经有基于搜狗云输入法接 ...
- 将vs+Qt的工程从windows平台移植到linux下_
将vs+Qt的工程从windows平台移植到linux下_崔杰城的博客-CSDN博客_windows下的qt工程移植到linux下 windows下Qt的开发人员常用vs+Qt ...
最新文章
- mysql計劃任務_MySQL計劃任務 | 學步園
- Oracle Dataguard 主备库的切换方法
- mysql存储引擎中INNODB和MyISAM的区别
- ElasticSearch入门 :Windows下安装ElasticSearch
- 200917阶段一C++双向链表模板
- STL源码剖析 priority_queue
- 重读 CenterNet,一个在Github有5.2K星标的目标检测算法
- 谈软件测试---一年测试工作总结
- 算法 | 八大排序算法,含动态图详解
- Microsoft SQL server Management Studio工具报错“应用程序的组件中发生了无法处理的异常”...
- Android 7.0应用冷启动流程分析
- 世界史上的6大古帝国
- Astronauts UVALive - 3713(2-SAT)
- Element-Ui 复选框动态改变绑定值,复选框未勾选问题
- cas单点登录配置,Java导入证书失败Keystore was tampered with, or password was incorrect
- Java jdt 编辑_java – 如何使用JDT以编程方式重命名方法
- 10+ 条 Go 官方谚语,你知道几条?
- 69的人因为穷不谈恋爱,这届年轻人脱单太难了
- 在ppt中插入html,PPT页面中插入浏览器方法 PPT中插入浏览器教程-PPT家园
- 红米9a手动root方法