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.
s'il vous plaît donner des entrées ('input' et' languagePair') –
exemple d'entrée: serait, lp: en | de renvoie w? Rde au lieu de würde – koin