C# WebClient 不返回 UTF-8

标签 c# utf-8 webclient

嘿 :) 我真的很努力地让 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;
}

最佳答案

Google 只是忽略在 AcceptCharset 中发送的编码 header 并在 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 header 添加到请求中,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 页面解析翻译更好使用。

关于C# WebClient 不返回 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46249801/

相关文章:

c# - 需要一些关于尝试模拟 .NET WebClient 或等效物的建议

.net - System.Net.WebClient 请求得到 403 Forbidden 但浏览器没有使用 Apache 服务器

c# - Xamarin ios 可达性不起作用

c# - CaSTLe Windsor 在组件已注册后使用选择器应用拦截器

c# - 如何在每 4 个字符之间的字符串中插入一个空格?

ruby-on-rails - HTTP Basic Auth 用户名中的 UTF-8 字符损坏

ruby-on-rails - Ruby on Rails 中带有 × 字符的 UTF-8 问题

c# - 尝试获取结果列表时等待/异步错误

Javadoc 错误 : unmappable character for encoding ASCII

c# - WebClient c# 使用\n 发送帖子而不换行