2017-09-16 3 views
2

Hey :) Ich versuche wirklich, WebClient mich UTF-8 zurückgeben. Aber wenn sub etwas wie Ä zurückgeben sollte, ist es eher ein E oder so denke ich.C# WebClient gibt UTF-8 nicht zurück

Gab eine Menge Workarounds einen Versuch, aber es wird nicht funktionieren.

private string translate(string input, string languagePair) 
{ 
    string url = String.Format("https://translate.google.com/?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair); 
    WebClient wc = new WebClient(); 
    wc.Headers.Add(HttpRequestHeader.AcceptCharset, "UTF-8"); 
    wc.Encoding = Encoding.UTF8; 
    var data = wc.DownloadData(url); 
    var result = Encoding.UTF8.GetString(data); 
    //string result = wc.DownloadString(url); 
    int start = result.IndexOf("result_box"); 
    string sub = result.Substring(start); 
    sub = sub.Substring(0, sub.IndexOf("</span>")); 
    start = sub.LastIndexOf(">"); 
    sub = sub.Substring(start + 1); 
    return sub; 
} 
+1

bitte geben sie eingaben ('input' und' languagePair') –

+0

beispiel eingang: würde, lp: de | de kehrt statt würde zurück – koin

Antwort

4

Google ignoriert einfach Codierung in AcceptCharset Header gesendet und gibt Antwort in ISO-8859-1, wie Sie von verkürzten Antwort sehen:

HTTP/1.1 200 OK 
Content-Type: text/html; charset=ISO-8859-1 
Content-Language: en 
Content-Length: 64202 

<!DOCTYPE html><html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> 

Deshalb, wenn Sie Antwort mit UTF-8-Kodierung dekodieren, ungültig erhalten Figuren. Wenn Sie gerade machen wollen es schnell zu arbeiten, habe ich festgestellt, dass, wenn User-Agent Header auf Anfrage hinzugefügt wird, gibt Google Antwort in UTF-8 und Sie können Rest des Codes lassen unmodifizierten:

private static string translate(string input, string languagePair) 
{ 
    string url = String.Format("https://translate.google.com/?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair); 
    WebClient wc = new WebClient(); 
    wc.Headers.Add(HttpRequestHeader.AcceptCharset, "utf-8"); 
    wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/55.0"); 
    wc.Encoding = Encoding.UTF8; 
    string result = wc.DownloadString(url); 
    int start = result.IndexOf("result_box"); 
    string sub = result.Substring(start); 
    sub = sub.Substring(0, sub.IndexOf("</span>")); 
    start = sub.LastIndexOf(">"); 
    sub = sub.Substring(start + 1); 
    return sub; 
} 

bessere Lösung ist, zu erkennen, Codierung als Antwort verwendet und für die Decodierung verwenden. WebClient verfügt nicht über diese Erkennung eingebaut, so können Sie entweder Lösung beschrieben here oder HttpClient stattdessen verwenden, die dies tut automatisch für Sie:

private static async Task<string> translate(string input, string languagePair) 
{ 
    string url = String.Format("https://translate.google.com/?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair); 
    using (var hc = new HttpClient()) 
    { 
     var result = await hc.GetStringAsync(url).ConfigureAwait(false); 
     int start = result.IndexOf("result_box"); 
     string sub = result.Substring(start); 
     sub = sub.Substring(0, sub.IndexOf("</span>")); 
     start = sub.LastIndexOf(">"); 
     sub = sub.Substring(start + 1); 
     return sub; 
    } 
} 

Bitte beachten Sie auch, dass Google Translation API hat, was könnte besser sein verwenden Sie lieber als die Übersetzung von der HTML-Seite zu analysieren.

+0

Danke funktioniert! – koin