解析GOOGLETRANSLATE特殊字符

问题描述:

首先,是不是为我付出了GOOGLETRANSLATE API的解决方案。解析GOOGLETRANSLATE特殊字符

我试图用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" 

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

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

结果:

"Me" 

这是一个没有分割字符串:

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

这是我已经试过:

统一标识符:

Google_Translate("Me \u0026 you") 

HTML实体:

Google_Translate("Me & you") 

HTML转义实体:

Google_Translate("Me &H38; you") 

...而HTML百分比:

Google_Translate("Me %26 you") 

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

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

,也许将意味着我需要做的唯一的事情是得到从谷歌串并转换的Unicode标识符就这样? ...不!因为如果我叫谷歌使用其他特殊字符,我没有得到任何Unicode标识符:

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

结果:

"Hello·\" World¿?" 

结果,而不分割:

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

我错过了?

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

+0

首先,是不是为我付出了汽车的解决方案。每当我试图进入Elektro Hacker的车时,警报就会熄灭。我错过了什么? –

+0

@Robert McKee真的,我不明白你的讽刺,你的问题是什么?Google的网络服务是免费的,为什么我不会尝试使用它?一个好的程序员寻找替代方法来做这件事。有些人不需要为API的所有功能付费,我希望以零星的方式使用它,我不希望支付20美元只在每月1到2次之间使用GoogleTranslate,也不需要API每1000个翻译字符(小偷)的使用限制为20美元。 – ElektroStudios

+0

谷歌翻译API REST Web服务不是免费的:https://developers.google.com/translate/您正在尝试使用v1 API而不付费,因为它是付费服务,而这确实在偷窃。 –

这里是如何(在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附加到url上即可。

对于谷歌翻译API,响应是JSON格式,也有关于如何解析JSON响应的很多帖子,所以我不会进入这里,但这些应该可以帮助您开始:How to decode a JSON string using C#?Convert JSON File to C# Object

+0

谢谢,但我有几个问题,1.代码需要API购买(我需要指定密钥?)?, 2.我不能使用解决方案来翻译JSon因为JavaScriptSerializer现在已经过时了,我发现这个:http://json.codeplex.com/这将解码字符串? – ElektroStudios

+0

根据目前的条款,是的,你需要设置一个计费账户来使API工作,并且通过那里获得密钥。至于JSON,有几种不同的反序列化方式,JSON.NET是比较流行的方法之一,你可以通过nuget安装它。 –

首先通过使用他们的网络接口,自动查询,你几乎肯定是违反了谷歌的使用条款,也将让你的应用程序非常脆弱,因为其中没有更改其前端代码,因为他们经常做停止谷歌。如果你每个月只做两三次翻译,你很可能只有二十次翻译才会破译。取决于你如何评价你的时间,你可能会花费更多的时间来修复它,以回应谷歌的变化,而不是使用API​​来付出代价。与大多数翻译服务相比,API价格便宜。

如果成本是一个大问题,它可能是值得看bing translation API是免费的。

最后发送的数据的正确方法是使用URI编码(你叫HTML百分比)比字母数字字符以外的任何其他。响应是一个JSON编码的字符串。使用像JSON.NET这样的框架来反序列化它。

+0

谢谢你的回答,但我已经尝试了”百分比“,也许你能告诉我一个使用URI的例子吗? – ElektroStudios

+0

@ElektroHacker上解码鉴于提示,但是我强烈建议你自己在做什么 – user1937198

+0

下面是使用URL/URI编码的例子:https://www.googleapis.com/language/translate/v2/detect?q=Me+% 26 +你&source = en&target = en –

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

输出:Web.HttpUtility.HtmlDecode(result)