搜狗云输入法移植到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的搜狗的云输入法,故决定停止开发吧。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <netdb.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <fcntl.h>
  9. #include <sys/time.h>
  10. #include <sys/types.h>
  11. #include <netinet/in.h>
  12. #include <sys/socket.h>
  13. #include<iconv.h>
  14. #define MaxRecvLen  255
  15. //定义网站结构
  16. struct DOMAIN
  17. {
  18. char url[255];      //完整网址
  19. char host[20];      //主机地址
  20. int  port;       //sock 联接的端口号
  21. };
  22. typedef struct DOMAIN domain;
  23. //*********************gb2312toutf-8****************
  24. int gb2312toutf8(char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen)
  25. {
  26. iconv_t cd;
  27. if( (cd = iconv_open("utf-8","gb2312")) ==0 )
  28. return -1;
  29. memset(destbuf,0,destlen);
  30. char **source = &sourcebuf;
  31. char **dest = &destbuf;
  32. if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))
  33. return -1;
  34. iconv_close(cd);
  35. return 0;
  36. }
  37. //***********************百度云输入法**************************
  38. char* Getword(domain web_domain)
  39. {
  40. //******************* 有关 sock 的变量 *************************
  41. int sock_id;       //sock 联接句柄
  42. struct hostent *hostbyname;    //主机的信息 结构
  43. struct sockaddr_in remote_addr;   //包含远端主机IP地址和端口号的结构
  44. //******************* 有关 无阻塞 select 所用到 的变量 *************
  45. struct timeval timeout;     //用于无阻塞 select 调用 的时间变量
  46. fd_set sockid_readable;     //sock 类似联接句柄 传递给 select 有效的连接
  47. char send_str[255];      //保存要发送的字符串
  48. char temp[2048];
  49. char result[512];
  50. char word[2048];
  51. char *recBuf;     //临时字串,接收到的字串指针
  52. int recv_numb;       //保存远端返回的字串大小
  53. timeout.tv_sec = 10;      //设置几秒钟超时
  54. timeout.tv_usec = 5000;    //设置几微秒超时
  55. //******************* 处理命令行的参数 *************************
  56. hostbyname = gethostbyname(web_domain.host);  //将基本名字和地址转换
  57. if((sock_id=socket(PF_INET,SOCK_STREAM,0))==-1)
  58. {
  59. perror("socket");
  60. exit(1);
  61. }
  62. //初始化远端要传递的socket
  63. remote_addr.sin_family=AF_INET;      //地址族
  64. remote_addr.sin_port=htons(web_domain.port);  //端口号
  65. remote_addr.sin_addr=*((struct in_addr *)hostbyname->h_addr);  //IP地址
  66. bzero(&(remote_addr.sin_zero),8);     //填充0 以保持与struct sockaddr同样大小
  67. //和服务器建立连接
  68. if(connect(sock_id,(struct sockaddr *)&remote_addr,sizeof(remote_addr))==-1)
  69. {
  70. perror("connect");
  71. exit(1);
  72. }
  73. //printf("\n\nconnected %s:%d ok!\n\n",web_domain.host,web_domain.port);
  74. //创建要发送给远端的字串
  75. 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);
  76. //printf("%s\n\n",send_str);
  77. //开始向服务器发送数据
  78. if(send(sock_id,send_str,strlen(send_str),0)==-1)
  79. {
  80. perror("send");
  81. exit(1);
  82. }
  83. recBuf=(char *)malloc(MaxRecvLen);  //为储存远端返回的字串的变量申请空间
  84. while(1)
  85. {
  86. //设置无堵塞模式
  87. FD_ZERO(&sockid_readable);
  88. FD_SET(sock_id,&sockid_readable);
  89. select(sock_id+1, &sockid_readable, NULL, NULL, &timeout);
  90. if (!FD_ISSET(sock_id, &sockid_readable))
  91. {
  92. printf("Timed out.\n");
  93. //break;
  94. }
  95. recv_numb = recv(sock_id,recBuf,MaxRecvLen,0); //得到远端返回的字串
  96. recBuf[recv_numb]=‘\0‘;
  97. gb2312toutf8(recBuf,strlen(recBuf),result,512);
  98. strcat(temp,result);
  99. if(recv_numb<1)  //返回的长度不够退出循环
  100. {
  101. break;
  102. }
  103. }
  104. //printf("\n\nrecv  ok!\n\n");
  105. close(sock_id);
  106. strcpy(word,temp+190);
  107. return word;
  108. }
  109. int main(int argc,char *argv[])
  110. {
  111. char tempStr[255],*temp;
  112. domain web_domain;      //定义一个 web domain 的结构
  113. strcpy(tempStr,"http://olime.baidu.com/py?pn=10&py=");
  114. strcat(tempStr,argv[1]);
  115. strcat(tempStr,"&rn=");
  116. strcat(tempStr,argv[2]);
  117. strcpy(web_domain.url,tempStr);
  118. strcpy(web_domain.host,web_domain.url+7);
  119. //处理 host
  120. if((temp=strstr(web_domain.host,"/")))
  121. {
  122. *temp=‘\0‘;         //web_domain.host 里去除:后的东西
  123. }
  124. if((temp=strstr(web_domain.host,":")))
  125. {
  126. *temp=‘\0‘;         //Host 里去除:后的东西
  127. web_domain.port=atoi(tempStr+1);    //改写端口
  128. }
  129. else
  130. {
  131. web_domain.port=80;
  132. }
  133. //printf("%s\n%d\n%s\n",web_domain.host,web_domain.port,web_domain.url);
  134. printf("%s\n",Getword(web_domain));
  135. return 0;
  136. }

本文出自 “天才鸟蛋” 博客,请务必保留此出处http://curley.blog.51cto.com/1627940/449044

搜狗云输入法移植到linux平台的想法,码迷,mamicode.com

时间: 2024-10-21 06:27:52

搜狗云输入法移植到linux平台的想法的相关文章

如何将lua移植到arm平台的linux内核

将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的,于是自己研究了下,现将它分享出来. 移植到arm平台,主要是要重新实现setjmp和longjmp两个函数,网上相关的资料很少,最后终于找到一个klibc的项目,里面有setmp和longjmp的arm平台的实现,于是直接拿来用了,不用说,当看到脚本在内核中执行并打印出"hello,world&q

jsoncpp linux平台编译和 arm移植

jsoncpp soncpp is an implementation of a JSON (http://json.org ) reader and writer in C++. JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and gener

jsoncpp linux平台编译和arm移植

下载 http://sourceforge.net/projects/jsoncpp/ 或者 http://download.csdn.net/detail/chinaeran/8631141 Linux平台编译 解压后运行如下命令: 安装 scons $ sudo apt-get install scons $ scons platform=linux-gcc 目标路径: 动态库:./libs/linux-gcc-4.8/libjson_linux-gcc-4.8_libmt.so 静态库:.

在 Linux 平台下使用 JNI

引言 Java 的出现给大家开发带来的极大的方便.但是,如果我们有大量原有的经过广泛测试的非 Java 代码,将它们全部用 Java 来重写,恐怕会带来巨大的工作量和长期的测试:如果我们的应用中需要访问到特定的设备,甚至是仅符合公司内部信息交互规范的设备,或某个特定的操作系统才有的特性,Java 就显得有些力不从心了.面对这些问题,Sun 公司在 JDK1.0 中就定义了 JNI 规范,它规定了 Java 应用程序对本地方法的调用规则. 实现步骤及相关函数使用 本文将一步步说明在 Linux 平

PylinuxQQ 实现linux平台使用qq

pylinuxqq是博主在linux平台下面使用webqq或者其他第三方插件,或者wine模拟,都或多或少的有一些缺陷.而且一直想锻炼一下,自己写一个linux平台下面的QQ.pylinuxqq基于python,目前博主还算小菜,正在开发当中.下面就记录下开发中遇到的一些问题: 项目地址:https://github.com/younfor/PyLinuxQQ 有兴趣的可以fork一份来一起开发 如何连接QQ 结合网上的方法,发现webqq最新版smartqq是相对比较容易的一种方法.通过pyt

Android c/c++ 应用向linux 平台迁移执行

鉴于近期在minicamera (linux + FPGA) 平台上模拟 安卓系统camera流程遭遇不断升级同步的困扰.尤其是 不开放源代码后 , 应用要链接封闭动态库造成的困难.以及在sprdisk上要不断升级对应的minicamera.minicamera 不能随着安卓系统同步升级. 这两个互相交杂在一起的致命问题,严重迟缓了camera 应用和内核驱动的开发測试进度. 在深圳同事的启示下,做最简单的方案尝试 1 将安卓的 c/c++ 应用及其依赖so编译出来. cp到 buildroot

net-snmp5.7.3移植到arm-linux平台

net-snmp5.7.3移植到arm-linux平台 本次交叉编译在ubuntu 15.04 64位系统下进行. 准备工作 在编译移植前有几项准备工作需要完成. 1下载net-snmp 5.7.3源码包 2安装交叉编译环境(arm-linux-gnueabi-gcc) 使用命令sudo apt-get install gcc-arm-linux-gnueabi安装即可. 编译配置 解压net-snmp源码包,然后进入源码包目录 unzip net-snmp-5.7.3.zip cd net-s

Windows下将ImageMagick移植到Android平台

Windows下将ImageMagick移植到Android平台 原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ ImageMagick是一个用来创建.编辑.合成图片的软件.它可以读取.转换.写入多种格式的图片.在移动平台做一些较复杂的图像处理时,难免会请出这尊大神.官方网站上也说明了它可以运行在多个平台之上,包括Android.不过官方的Releases版本只有Unix.Mac OS X.IOS.Windows

《net-snmp5.7.3移植到arm-linux平台》

net-snmp5.7.3移植到arm-linux平台 本次交叉编译在ubuntu 15.04 64位系统下进行. 准备工作 在编译移植前有几项准备工作需要完成. 1下载net-snmp 5.7.3源码包 2安装交叉编译环境(arm-linux-gnueabi-gcc) 使用命令sudo apt-get install gcc-arm-linux-gnueabi安装即可. 编译配置 解压net-snmp源码包,然后进入源码包目录 unzip net-snmp-5.7.3.zip cd net-s