【问题标题】:Encode in webclient unexpected result在 webclient 中编码意外结果
【发布时间】:2012-04-20 01:51:57
【问题描述】:

我尝试使用 webclient 将单词“香蕉”翻译成 rus

private void button1_Click(object sender, EventArgs e)
    {
        Navigate("http://translate.google.ru/translate_a/t?client=x&text=Banana&hl=en&sl=en&tl=ru");
    }

    private void Navigate(String address)
    {
        WebClient client = new WebClient();            
        client.Proxy = WebRequest.DefaultWebProxy;
        client.Credentials = new NetworkCredential("user", "password", "domain");
        client.Proxy.Credentials = new NetworkCredential("user", "password", "domain");
        string _stranslate = client.DownloadString(new Uri(address));
    }

我想在“_stranslate”中看到

{"sentences":[{"trans":"Банан","orig":"Banana@","translit":"Banan@","src_translit":""}],"src":" zh","server_time":0}

但是得到了这个

{"sentences":[{"trans":"вБОБО","orig":"Banana@","translit":"Banan@","src_translit":""}],"src":" zh","server_time":0}

有人可以帮我吗?

【问题讨论】:

    标签: c# encoding google-translate


    【解决方案1】:

    恕我直言更好的解决方案:添加URI查询参数 oe=UTF-8 并在任何地方使用 UTF-8

    var nameValueCollection = new NameValueCollection
    {
        {"client", "x"},
        {"text", HttpUtility.UrlEncode(text)},
        {"hl", "en"},
        {"sl", fromLanguage},
        {"tl", toLanguage},
        {"ie", "UTF-8"},
        {"oe", "UTF-8"}
    };
    
    string htmlResult;
    using (var wc = new WebClient())
    {
        wc.Encoding = Encoding.UTF8;
        wc.QueryString = nameValueCollection;
        htmlResult = wc.DownloadString(GoogleAddress);
    }
    

    【讨论】:

      【解决方案2】:

      尝试检查响应标头,内容类型会告诉您应该使用什么编码。

      Content-Type => text/javascript; charset=KOI8-R

      所以只需添加这一行。

      client.Encoding = Encoding.GetEncoding(20866);
      

      client.Encoding = Encoding.GetEncoding("KOI8-R");
      

      完整的编码列表可以在Encoding Class的文档中找到

      另一种方法是使用System.Net.Mime.ContentType 来获取字符集。 像这样:

      byte[] data = client.DownloadData(url);
      ContentType contentType = new System.Net.Mime.ContentType(client.ResponseHeaders[HttpResponseHeader.ContentType]);
      string _stranslate = Encoding.GetEncoding(contentType.CharSet).GetString(data);
      

      【讨论】:

      • 我添加了这一行 client.Encoding = Encoding.GetEncoding("KOI8-R");一切顺利,谢谢。
      • @Likurg:我再次编辑了我的答案,如果您必须处理许多不同的字符集,可能会有所帮助。
      • 这很奇怪@shriek。当我查询该 URL 时,它以 UTF-8 格式返回给我。我想知道它是否会向不同的国家/地区返回不同的编码。我什至从未听说过 KOI8-R。我认为您处理响应标头的第二组代码非常好。我什至不知道WebClient 可以退货。我打算建议HttpWebRequest。赞成。
      • @Chris Benard,我尝试了您发布的测试网站,它返回 UTF-8,但是当我从测试项目中尝试时,我得到了 KOI8-R。我还尝试了在线嗅探器(web-sniffer.net)并得到了相同的结果。至于WebClient,是的,它几乎可以做任何你想做的事情,如果有什么不能做的,你总是可以对它进行子类化。 :)
      • 感谢两位的帮助。我用 System.Net.Mime.ContentType 更新我的代码。顺便说一句,当我的美国朋友尝试使用我的原始代码和@Chris Benard 更正时,他说一切正常。
      【解决方案3】:

      在你的client.DownloadString()之前添加这个:

      client.Encoding = System.Text.Encoding.UTF8;
      

      当您读取字符串时,您的编码可能会变得混乱。

      使用this HTTP header viewer 并输入您的网址,我在标题中看到以下内容:

      Content-Type: text/javascript; charset=UTF-8
      Content-Language: ru
      

      基本上,您需要找出他们发回的编码并设置您的编码以匹配。

      在调用DownloadString()之前设置编码非常重要。

      【讨论】:

      • 我尝试了两种变体,它们没有帮助
      • 顺便说一句,我尝试在 Chrome 中访问此网址,但我得到了带有普通文本的文件?在此之后,我使用 webbrowser 控件,当我将其导航到我的 url 时,会出现标准下载文件对话框,并且在安全文件中是正确的文本。
      • 请发布更新的代码@Likurg。我实际上使用了您的代码并将其写到一个文件中,它看起来不错。如果您查看this HTTP Header viewer 并输入您的网址,您会看到编码是 UTF-8,所以前者应该可以正常工作。您必须将编码行放在您的DownloadString() 调用之前。
      • 添加 client.Encoding = System.Text.Encoding.UTF8 对您没有帮助 - 谷歌对俄语没有意义(它使用西里尔文)。请参阅下面的答案
      猜你喜欢
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2018-09-04
      相关资源
      最近更新 更多