【问题标题】:C# WebClient doesn't return UTF-8C# WebClient 不返回 UTF-8
【发布时间】:2017-09-16 03:40:26
【问题描述】:

嘿 :) 我正在努力让 WebClient 返回 UTF-8。但是当 sub 应该返回类似 Ä 的东西时,它更像是 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;
}

【问题讨论】:

  • 请提供意见(inputlanguagePair
  • 示例输入:would, lp: en|de 返回 w?rde 而不是 würde
  • 您好,您可以更改您的误导性标题! WebClient 可以读取 UTF-8 !您的问题与 Google 翻译有关,与 WebClient 无关。更改您的标题是合适的!

标签: c# utf-8 webclient


【解决方案1】:

Google 只是忽略在 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 没有内置此检测功能,因此您可以使用here 描述的解决方案或改用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;
    }
}

另外请注意,Google 有 Translation API,使用它可能比从 HTML 页面解析翻译更好。

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 2012-11-14
    • 1970-01-01
    • 2014-11-02
    • 2011-09-07
    • 2021-08-31
    • 2013-11-28
    • 2017-12-11
    • 2012-06-02
    相关资源
    最近更新 更多