【问题标题】:Parsing GoogleTranslate especial characters解析谷歌翻译特殊字符
【发布时间】:2016-10-18 15:20:30
【问题描述】:

首先,这不是我为 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 转义实体:

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]

我错过了什么?

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

【问题讨论】:

  • 首先,不是我买车的解决方案。每当我试图进入Elektro Hacker's 车时,警报就会响起。我错过了什么?
  • @Robert McKee 真的我无法理解你的讽刺,你的问题是什么?,谷歌网络服务是免费的,为什么我不会尝试使用它?,一个优秀的程序员寻找替代方法做事。有些人不需要为 API 的所有功能付费,我想以零星的方式使用它,我不想花 20 美元每月只使用 1 到 2 次 GoogleTranslate,还有 API每 1.000.000 个翻译字符(小偷)的使用限制为 20 美元。
  • 谷歌翻译 API REST 网络服务不是免费的:developers.google.com/translate 你正在尝试不付费使用 v1 API,当它是付费服务时,这确实是在窃取。跨度>
  • 另外,请阅读第5节题为“费用”的最后一句:developers.google.com/translate/v2/terms,其中注明You may not access the Translate API in a manner intended to avoid incurring fees.

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


【解决方案1】:

首先,通过使用他们的网络界面进行自动查询,您几乎可以肯定违反了 Google 的使用条款,并且还会使您的应用程序变得非常脆弱,因为没有什么可以阻止 Google 像他们经常做的那样更改他们的前端代码。如果您每个月只进行两到三份翻译,您可能只会得到二十份翻译,然后就会中断。根据您对时间的重视程度,您可能会花费更多时间来修复它以响应 Google 的更改,而不是使用 API 所花费的时间。与大多数翻译服务相比,该 API 价格低廉。

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

最后,发送数据的正确方法是对字母数字字符以外的任何内容使用 URI 编码(您称之为 html 百分比)。响应是 JSON 编码的字符串。使用像JSON.NET 这样的框架来反序列化它。

【讨论】:

  • 感谢您的回答,但我已经尝试了“百分比”,也许您可​​以给我看一个使用 URI 的示例吗?
  • @ElektroHacker 给出了解码提示,但我强烈建议您不要这样做
  • 这里是一个使用 URL/URI 编码的例子:googleapis.com/language/translate/v2/…
  • @Robert McKee 谢谢,但只是一个问题,那个 url 需要 API 密钥许可,对吗?我试图打开它,它说错误代码 403 未经授权使用,我在我的代码示例答案中尝试了相同的编码并且不起作用
【解决方案2】:

下面是方法(在 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。

对于 google translate API,响应是 JSON 格式,有很多关于如何解析 JSON 响应的帖子,所以我不会在这里讨论,但是这些应该可以帮助您入门:How to decode a JSON string using C#?Convert JSON File to C# Object

【讨论】:

  • 谢谢,但我有几个问题,1.代码需要API购买(我需要指定密钥?)?,2.我不能使用翻译JSon的解决方案,因为JavaScriptSerializer现在已经过时了,我发现了这个:json.codeplex.com 这可以解码字符串吗?
  • 按照目前的条款,是的,您需要设置一个计费帐户才能使 API 正常工作,并通过那里获得密钥。至于JSON,反序列化有几种不同的方式,JSON.NET是比较流行的方式之一,可以通过nuget安装。
【解决方案3】:

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

输出:Web.HttpUtility.HtmlDecode(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多