先来看一下程序界面以及效果




首先如Title,是百度的翻译。因为英文水平有限,所以每次都求翻译,有一次注意到百度的翻译不需要登录就可以翻译,于是就猜到只要发送正确的请求就一定能获得服务器返回的数据。所以照着百度翻译的界面开始搞起来。

一:监视请求,捕获有用的请求地址

我用的是谷歌浏览器,直接按 F12 就可以监视请求了。





二:分析地址和参数

通过监视请求,发现语言类型判断地址 http://fanyi.baidu.com/langdetect
判断语言类型的参数只有一个 query:待翻译内容【即便是汉字也不需要进行HttpUtility.UrlEncode操作】

返回数据的格式如上图。{"error":0,"msg":"success","lan":"zh"} 格式不变,其中 lan后的值就是服务器判断出的语言类型

翻译地址是http://fanyi.baidu.com/v2transapi

翻译所需参数有四个 from :从什么语言

to : 翻译为什么语言

query:翻译的内容 【汉字等需要经过HttpUtility.UrlEncode操作】

transtype :trans 【不知道干什么的参数,我一直都带着】

语言的参数有以下几种,我都给大家收集完毕了

string[] strsLan = { "auto-自动检测","ara-阿拉伯语","de-德语","ru-俄语","fra-法语","kor-韩语","nl-荷兰语","pt-葡萄牙语","jp-日语","th-泰语","wyw-文言文","spa-西班牙语","el-希腊语","it-意大利语","en-英语","yue-粤语","zh-中文" };

返回参数格式如下图:

如图所示:dst后的数据就是一条一条翻译的数据,亲,data下不止一条数据哦。我这里测试的不全,返回的 数据格式 我记得有时候是变化的

在这里,我能想到的简单的操作是 用FrameWork4.0及更高版本,然后去引入 Newtonsoft.Json.dll 去处理Json数据,或者干脆写网页程序,Ajax中设置 dataType:"json"。

但是我写的WinForm程序是3.5版本的,为了就是能在Win7电脑上直接用。

三:正则解析

所以我决定用正则表达式匹配结果

正则表达式匹配的那段代码如下:【返回的数据很多,我只取出直接翻译的内容进行拼接,如果大家想像百度翻译那样,多解析点东西就好了】

Regex reg = new Regex(@"(""dst"":""([^""]+)"")");
MatchCollection mat = reg.Matches(resultStr);
if (mat.Count > 0)
{
    string strs = "";
    string str = "";
    foreach (Match m in mat)
    {
        //txt_from.Text += "\r\n" + mat.Groups[0];
        str = m.Groups[2].ToString();
        //如果是汉字的unicode,转换
        if (str.Contains('\\'))
        {
            str = ToGB2312(str);
        }
        strs += str+"\r\n\r\n";
    }
    txt_to.Text = strs;
}
else
{
    MessageBox.Show("没有匹配项");
}

代码很简单,我解释下正则匹配项


四:引用传值

最后解释下这个语言选择Form


这是个窗体

设置 ShowInTaskbar 属性为False【确定窗体是否出现Windows任务栏中】

设置 FormBorderStyle属性为None【指示窗体的边框和标题栏的外观和行为】如此,窗体就不像窗体了,更像个用户控件

注意:这个选择语言的Form只能用Show()方法,不能用ShowDialog()方法,否则无法触发 失去焦点事件。

绑定 Deactivate 事件或 Leave事件 ,代码如下【这样当这个窗体失去焦点后,自动消失,用户体验好】

private void Frm_Language_Leave(object sender,EventArgs e)
{
    this.Close();
}
绑定 Load 事件,代码如下【为按钮加点击事件,其中 Btn是这个窗体初始化的时候传入的,Button是引用类型,对传入的参数操作,会影响原Button的】
public Button Btn { get; set; }

public Frm_Language()
{
    InitializeComponent();
}
private void Frm_Language_Load(object sender,EventArgs e)
{
    if (Btn.Text.StartsWith("目标语言"))
    {
        btn_auto.Enabled = false;
    }
    string langSelect = Btn.Tag.ToString();//拿到传入的语言是哪个
    foreach (var control in this.Controls)
    {
        if (control.GetType().Name == "Button")
        {
            Button bt = (Button)control;
            if (bt.Text != "取消")
            {
                bt.Click += new EventHandler(bt_Click);
                if (bt.Name.EndsWith(langSelect))
                {
                    bt.Select();
                }
            }
        }
    }
}
void bt_Click(object sender,EventArgs e)
{
    Btn.Tag = ((Button)sender).Name.Substring(4);
    if (Btn.Text.StartsWith("源语言"))
    {
        Btn.Text = "源语言:" + ((Button)sender).Text;
    }
    else
    {
        Btn.Text = "目标语言:" + ((Button)sender).Text;
    }
    this.Close();
}
五:一些辅助方法
C#发送 Post请求的方法
private string PostWebRequest(string postUrl,string paramData,Encoding dataEncode)
{
    string ret = string.Empty;
    try
    {
        byte[] byteArray = dataEncode.GetBytes(paramData); //转化
        HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
        webReq.Method = "POST";
        webReq.ContentType = "application/x-www-form-urlencoded";

        webReq.ContentLength = byteArray.Length;
        Stream newStream = webReq.GetRequestStream();
        newStream.Write(byteArray,byteArray.Length);//写入参数
        newStream.Close();
        HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
        StreamReader sr = new StreamReader(response.GetResponseStream(),Encoding.Default);
        ret = sr.ReadToEnd();
        sr.Close();
        response.Close();
        newStream.Close();
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
    return ret;
}
C#将Unicode编码转换为汉字字符串
/// <summary>
/// 将Unicode编码转换为汉字字符串
/// </summary>
/// <param name="str">Unicode编码字符串</param>
/// <returns>汉字字符串</returns>
public static string ToGB2312(string str)
{
    string r = "";
    MatchCollection mc = Regex.Matches(str,@"\\u([\w]{2})([\w]{2})",RegexOptions.Compiled | RegexOptions.IgnoreCase);
    byte[] bts = new byte[2];
    foreach (Match m in mc)
    {
        bts[0] = (byte)int.Parse(m.Groups[2].Value,NumberStyles.Hexnumber);
        bts[1] = (byte)int.Parse(m.Groups[1].Value,NumberStyles.Hexnumber);
        r += Encoding.Unicode.GetString(bts);
    }
    return r;
}

通过一个翻译程序复习下 抓数据、正则表达式等的更多相关文章

  1. HTML5 input新增type属性color颜色拾取器的实例代码

    type 属性规定 input 元素的类型。本文较详细的给大家介绍了HTML5 input新增type属性color颜色拾取器的实例代码,感兴趣的朋友跟随脚本之家小编一起看看吧

  2. amazeui模态框弹出后立马消失并刷新页面

    这篇文章主要介绍了amazeui模态框弹出后立马消失并刷新页面,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 移动HTML5前端框架—MUI的使用

    这篇文章主要介绍了移动HTML5前端框架—MUI的使用的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. AmazeUI 模态窗口的实现代码

    这篇文章主要介绍了AmazeUI 模态窗口的实现代码,代码简单易懂,非常不错,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. ios – UIPopoverController出现在错误的位置

    所以我花了一些时间寻找答案,但到目前为止还没有找到任何答案.我正在尝试从UIInputAccessoryView上的按钮呈现弹出窗口.UIBarButtonItem我想显示popover来自定制视图,所以我可以使用图像.我创建这样的按钮:当需要显示popover时,我这样做:但我得到的是:弹出窗口看起来很好,但它应该出现在第一个按钮上时出现在第二个按钮上.然后我发现了这个问题:UIBarButto

  7. ios – 关闭UIBarButtonItem上的突出显示

    我正在尝试使用UIBarButtonItem在我的UIToolbar上添加标题.我使用简单的风格,看起来很好,但我似乎无法让它停止突出显示触摸.“突出显示时触摸”选项不适用于条形按钮项目.有没有快速简便的方法来做到这一点?

  8. 以编程方式调整iOS中的按钮大小

    我正在使用XCode4.6.1并开发iOS6.我在故事板上添加了一个按钮.我在我的实现文件ViewController.m中创建了一个插座:我尝试按如下所示更改按钮b1的属性(在同一个文件中:ViewController.m):当我在模拟器中运行应用程序时,按钮的alpha成功设置为0.5.但是,按钮的位置和大小不会改变.我尝试了各种方法来实现它.然而似乎没有任何作用.我想知道我做错了什么.我对O

  9. 如何在iOS / Swift的顶部导航栏中添加“继续”按钮

    我想在导航栏的右侧添加一个“继续”按钮.如何实现这一目标?我一直在尝试使用UIBarButtonItem上的一些方法,但无法使其正常工作.我迄今为止的最大努力是:但我在第一行遇到错误.它不喜欢“style”参数.我也试过了但没有运气.仍然停留在样式参数上.有任何想法吗?

  10. ios – 将图像添加到界面构建器中的按钮

    我想在我的按钮而不是文本中添加图像.我可以在界面构建器中这样做吗?我可以看一下这个例子吗?

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部