解析谷歌翻译特殊字符

时间:2013-06-02 05:11:33

标签: .net vb.net get google-translate

首先,对我来说,支付GoogleTranslate API并不是一个解决方案。

我正在尝试使用Get方法翻译一个包含特殊字符“&”的简单短语。

"Me & You"

这是我写的方法:

Public Function Google_Translate(ByVal Input As String, _
                                 ByVal From_Language As Languages, _
                                 ByVal To_Language As Languages) As String

    Dim webClient As New System.Net.WebClient

    Dim str = webClient.DownloadString( _
    "http://translate.google.com/translate_a/t?client=t&text=" & Input & _
    "&sl=" & Formatted_From_Language & _
    "&tl=" & Formatted_To_Language & "")

    ' Debug: MsgBox(str)

    Return (str.Substring(4, str.Length - 4).Split(ControlChars.Quote).First)

End Function

这是一个用法示例:

Google_Translate("Me and you", Languages.en, Languages.en)

结果是相同的字符串'因为我已经从英语翻译成英语:

"Me and you"

问题是当我尝试使用任何特殊的HTML字符时,例如“&”:

Google_Translate("Me & you", Languages.en, Languages.en)

结果:

"Me"

这是没有拆分的字符串:

[[["Me","Me","",""]],,"en",,,,,,,0]
  

这就是我尝试过的所有内容:

Unicode标识符:

Google_Translate("Me \u0026 you")

HTML实体:

Google_Translate("Me & you")

HTML Escaped实体:

Google_Translate("Me &H38; you")

......和HTML百分比:

Google_Translate("Me %26 you")

...使用百分比调用方法我得到一个带有Unicode标识符的字符串:

[[["Me \u0026 you","Me \u0026 you","",""]],,"en",,,,,,[["en"]],0]

这可能意味着我唯一需要做的就是从Google获取字符串并翻译unicode标识符,这就是全部? ...不!因为如果我使用其他特殊字符给Google打电话,我没有获得任何unicode标识符:

Google_Translate("Hello·"" World¿?", GoogleTranslate_Languages.en, GoogleTranslate_Languages.en)

结果:

"Hello·\" World¿?"

没有拆分的结果:

[[["Hello·\" World¿?","Hello·\" World¿?","",""]],,"en",,,,,,[["en"]],0]

我缺少什么?

如何使用特殊字符以正确的方式发送/获取数据&%$“¿????

3 个答案:

答案 0 :(得分:1)

首先,通过使用他们的网络界面进行自动查询,您几乎肯定会违反Google的使用条款,并且会使您的应用程序变得非常脆弱,因为没有什么能阻止Google像往常一样更改前端代码。如果你每个月只做两到三次翻译,你可能只有二十次翻译才有机会。根据您重视时间的方式,您可能会花费更多时间来修复它以响应Google的更改而不是使用API​​。与大多数翻译服务相比,API价格便宜。

如果费用是一个大问题,那么可能值得查看免费的bing translation API

最后,发送数据的正确方法是使用URI编码(您称之为html百分比),而不是使用字母数字字符。响应是JSON编码的字符串。使用JSON.NET之类的框架对其进行反序列化。

答案 1 :(得分:1)

这是(在C#中):

首先,使用您需要的输入创建名称值集合:

var nvc = new NameValueCollection
                {
                    {"q", input},
                    {"source", "en"},
                    {"target", "en"},
                    {"key","Your translate API key here"}
                };

然后你可以调用这样一个函数:

internal string Post(string url, ref CookieContainer cookieJar, NameValueCollection nvc, string referer = null)
{
    var postdata = string.Join("&", Array.ConvertAll(nvc.AllKeys, key => string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(nvc[key]))));
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.CookieContainer = cookieJar;
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0";
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    request.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    request.Headers.Add("Accept-Encoding", "gzip, deflate");
    request.Headers.Add("Accept-Language", "en-us");
    request.Method = "POST";
    request.KeepAlive = true;
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = postdata.Length;
    if (!string.IsNullOrEmpty(referer))
        request.Referer = referer;

    var writer = new StreamWriter(request.GetRequestStream());
    writer.Write(postdata);
    writer.Close();

    var response = (HttpWebResponse)request.GetResponse();
    var resp = (new StreamReader(response.GetResponseStream())).ReadToEnd();
    return resp;
}

这是电话:

var result=Post("https://www.googleapis.com/language/translate/v2/detect",ref new CookieContainer(),nvc);

对于较小的输入值,您可以使用GET而不是POST,只需在?之后将postdata附加到网址上。

对于谷歌翻译API,响应是JSON格式,有很多关于如何解析JSON响应的帖子,所以我不会在这里讨论,但这些应该可以帮助你开始:How to decode a JSON string using C#? { {3}}

答案 2 :(得分:0)

输入:Web.HttpUtility.UrlEncode("You & Me")

输出:Web.HttpUtility.HtmlDecode(result)