2017-09-16 1 views
2

Hey :) Je suis vraiment en train de faire en sorte que WebClient me renvoie UTF-8. Mais quand sub devrait retourner quelque chose comme Ä c'est plus un E ou alors je pense.C# WebClient ne retourne pas UTF-8

Donné beaucoup de solutions de contournement un essai, mais cela ne fonctionnera pas.

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

s'il vous plaît donner des entrées ('input' et' languagePair') –

+0

exemple d'entrée: serait, lp: en | de renvoie w? Rde au lieu de würde – koin

Répondre

4

Google ignore simplement le codage envoyé en AcceptCharset têtes et renvoie la réponse dans ISO-8859-1, comme vous pouvez le voir réponse raccourci:

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"> 

Par conséquent, lorsque vous décodez réponse à l'aide encodage UTF-8, vous obtenez invalide personnages. Si vous voulez juste faire fonctionner rapidement, j'ai trouvé que lorsque User-Agent en-tête est ajouté à la demande, Google renvoie une réponse en UTF-8 et vous pouvez alors laisser le reste du code non modifié:

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; 
} 

meilleure solution est de détecter encodage utilisé en réponse et l'utiliser pour le décodage. WebClient n'a pas cette détection intégrée, de sorte que vous pouvez soit solution d'utilisation décrite here ou utiliser HttpClient à la place, ce qui le fait automatiquement pour vous:

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; 
    } 
} 

également s'il vous plaît noter que Google a Translation API, ce qui pourrait être mieux utiliser plutôt que d'analyser la traduction de la page HTML.

+0

Merci œuvres! – koin