2013-06-02 183 views
-1

首先,是不是爲我付出了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而不付費,因爲它是付費服務,而這確實在偷竊。 –

回答

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附加到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安裝它。 –

1

首先通過使用他們的網絡接口,自動查詢,你幾乎肯定是違反了谷歌的使用條款,也將讓你的應用程序非常脆弱,因爲其中沒有更改其前端代碼,因爲他們經常做停止谷歌。如果你每個月只做兩三次翻譯,你很可能只有二十次翻譯纔會破譯。取決於你如何評價你的時間,你可能會花費更多的時間來修復它,以迴應谷歌的變化,而不是使用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 –

0

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

輸出:Web.HttpUtility.HtmlDecode(result)