C#实现百度翻译功能

来源:互联网 发布:银行数据分析报告 编辑:程序博客网 时间:2024/06/15 05:22

最近工作上没有什么事情,比较清闲,但是闲着又不舒服,在浏览码农网,看到一个博客,自己实现百度翻译的功能,感觉挺有意思的,就自己也学着实现了一下,用了接近一天的时间,最终完成了最基本的功能—–翻译英文单词。这里建议自己(毕竟编程小白的博客也没有几个看)没事多看看码农网,虽然活跃用户不多,但是里面的文章质量都非常高,费说少说,下面进入正题。
要实现翻译功能,其核心就是调用百度开放的翻译API接口,具体内容和文档请查看百度开发者平台–翻译。从开发文档中,可以总结出完成翻译功能的三个步骤:

  1. 利用得到APP ID和秘钥,使用MD5算法生成签名
  2. 对签名进行加密
  3. 将加密后的签名,APPID 秘钥 随机数写入请求字符串
  4. 发送请求字符串
  5. 接受反馈回来的json数据,进行json数据进行反序列化
  6. 最终得到翻译后的中文意思
    步骤明确了,剩下来的就是用代码实现了。
    百度反馈回来的数据是json格式的,为了写代码方便,首先创建一个类,用于存放json数据,具体代码如下:
using System.Collections.Generic;namespace baidufanyi{    class TransObj    {       //注意:就是此类的三个属性名称必须和json数据里面的key一致        public string from { set; get; }        public string to { set; get; }        public List<TransResult> trans_result { set; get; }      }    class TransResult    {        public string src { set; get; }        public string dst { set; get; }    }}

由于要实现的功能仅仅只是翻译而已,因此界面非常简单,我的界面如下:

因为秘钥和APPID都是固定的,而随机数不是固定的因此分别定义如下:
这里写图片描述
双击翻译按钮,得到按钮响应函数:

        private void translate_Click(object sender, EventArgs e)        {            zh.Text = null;            //WebClient类  提供用于将数据发送到由URI标识的资源,以及从由URI标识的资源接受数据的常用方法             WebClient client = new WebClient();            string txtInput = en.Text;            string sign = GetMd5Sign();            string url = string.Format("http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from=en&to=zh&appid={1}&salt={2}&sign={3}",txtInput, appid, randomString, sign);            byte[] buffer = client.DownloadData(url);            //从指定url加载资源                         string result = Encoding.UTF8.GetString(buffer); //将指定字节数组中的所有字节解码为一个字符串            TransObj transObj = JsonConvert.DeserializeObject<TransObj>(result);                zh.Text = transObj.trans_result[0].dst;        }

对签名进行MD5加密函数如下:

        private String GetMd5Sign()        {            ASCIIEncoding encoding = new ASCIIEncoding();            string sign = null;            randomString = GetRandomString();            sign = appid + en.Text + randomString + secretKey;            byte[] buffer = encoding.GetBytes(sign);           //将指定的字符串中的所有字符编码为一个UTF-8字节序列            MD5 md5 = MD5.Create();                            //使用Create() 创建默认实例            byte[] hash = md5.ComputeHash(buffer);             //开始加密            StringBuilder sb = new StringBuilder();            for(int i = 0; i<hash.Length;i++)            {                sb.AppendFormat("{0:x2}",hash[i]);            }            return sb.ToString();                              //输出MD5加密后的字符串        }

获取随机数的函数,虽然在百度开发文档中介绍 salt随机数是整数,但是在整合到请求字符串中,还是会转换为字符串,只不过是一个纯数字字符串罢了,因此下面的函数直接得到一个随机的纯数字字符串。

        private String GetRandomString()        {            StringBuilder stringBuilder = new StringBuilder();            Random random = new Random();            for(int i = 0; i<10;i++)            {                stringBuilder.Append(random.Next(0,9));            }            return stringBuilder.ToString();        }

为了方便,程序还增加了一个快捷键功能,按下回车键时,调用按钮响应函数。

        private void TranslateForm_KeyDown(object sender, KeyEventArgs e)        {            if(e.KeyValue == Convert.ToInt32(Keys.Enter))            {                translate_Click(null,null);            }        }

以上代码就是所有的代码,虽然代码比较简单,但是我在写代码的过程中仍然遇到了几个问题,因为我的不熟悉。
定义类存放json数据的时候,属性名称一定要和json数据的key名称一致,否则在对json进行反序列化的时候该属性为null。
当然该程序现在仅有的功能就是翻译单词和简单的句子
这里写图片描述
这里写图片描述


总结该程序用到的我不熟悉的知识点:

  1. WebClient类。提供用于将数据发送到和接收来自通过 URI 确认的资源数据的常用方法。具体详情参考WebClient类详解
  2. json数据的序列化和反序列化,json数据序列化和反序列化网上有很多种方法,本程序用的是nuget管理器下载安装的第三方类库Netonsoft.Json,在json反序列化用到了泛型方法
    public static T DeserializeObject<T>(string value);
  3. MD5加密算法。C#有一个专门的类库用来实现MD5加密算法的。关于MD5加密,网上已经有很多好的解释,我就不在说了。MD5加密介绍实现
    加密主要由下面几句代码完成。
            //需要加密的字符串            sign = appid + en.Text + randomString + secretKey;            //将指定的字符串中的所有字符编码为一个UTF-8字节序列            byte[] buffer = encoding.GetBytes(sign);              //使用Create() 创建默认实例            MD5 md5 = MD5.Create();                //开始加密                                   byte[] hash = md5.ComputeHash(buffer);            
  1. 自己都感觉写的好乱,没有把自己的想法清晰的表达出来,唯一的进步或许就是自己已经开始写博客了,相信自己以后会越写条理越清晰。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 热带鱼小鱼抢食大鱼吃不到怎么办 家里养的植物土壤里有虫子怎么办 哺乳期乳房有硬块乳头有白点怎么办 税务查税拿到不开票销售合同怎么办 买地皮是集体证已交钱了怎么办 word里的字体都是英文版怎么办 华为手机开机卡在菊花那里怎么办 车辆挂牌时公司名称打错了怎么办 经营异常名录查不到怎么办移除 企业被列入经营税务异常名录怎么办 手机号被别人绑定了企业微信怎么办 刚出生一天的婴儿不肯吃奶怎么办 9个月孩子不好好吃奶怎么办 孩子2个月吃奶老是呛到怎么办 孩子4个月不好好吃奶怎么办? 3个月的孩子不吃奶肚子胀怎么办 刚出生的婴儿吃完奶打嗝怎么办 宝宝刚生下来一直睡觉不吃奶怎么办 刚生下来的婴儿不吃奶怎么办 刚生下来的小猫不吃奶怎么办 刚生的小羊羔不吃奶怎么办 刚出生的婴儿不会吸奶怎么办 生完小孩七十天妈妈咳嗽怎么办 带欣的名字三个字儿的怎么办 二十多岁的儿子沉迷游戏网络怎么办 为什么打开游戏网络却用不了怎么办 打来微信网页版显示证书错误怎么办 开了家定制家具店生意不好怎么办 宝宝起风疹怎么办要注意的问题 超市买的内裤西铁牌子没去掉怎么办 没申请生产许可证贴标了怎么办 淘宝没有品牌非要我写品牌怎么办没 意外怀孕明明一直用安全套的怎么办 找不到百度网盘的dns地址怎么办 小米众筹到了发货时间不发货怎么办 不知道电脑宽带连接账号密码怎么办 电脑如果宽带账号密码忘记了怎么办 xp电脑用户名和密码忘了怎么办 电脑的用户名和密码忘记了怎么办 电脑重置后需要用户名和密码怎么办 电脑登录用户名和密码忘记了怎么办