C# WebClient不返回UTF-8

4

嘿 :) 我正在努力让WebClient返回UTF-8编码。但是当子程序应该返回像Ä这样的内容时,它会变成E或者类似的字符。

我已经尝试了很多解决方法,但都无法解决问题。

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

2
请提供输入(inputlanguagePair - Richard Schneider
例如输入:would,lp: en|zh-CN 返回“将”而不是“会”。 - koin
你好,能否更改误导性的标题!WebClient 可以读取 UTF-8!你的问题与 Google 翻译有关,而不是 WebClient。更改标题是合适的! - schlebe
1个回答

7

谷歌会忽略在 AcceptCharset 头部发送的编码,并以 ISO-8859-1 返回响应,如您从缩短的响应中所见:

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

因此,当您使用UTF-8编码解码响应时,会出现无效字符。如果您只想快速使其工作,我发现当在请求中添加User-Agent头时,Google会以UTF-8返回响应,您可以保持其余代码不变:
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;
}

更好的解决办法是检测响应中使用的编码并将其用于解码。 WebClient没有内置此检测功能,因此您可以使用此处描述的解决方案,或者改为使用HttpClient,后者会自动执行此操作:
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;
    }
}

另外请注意,谷歌有翻译API,可能比从HTML页面解析翻译更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接