在webclient意外结果中编码

Lik*_*urg 4 c# encoding google-translate

我尝试使用webclient将单词'Banana'翻译成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));
    }
Run Code Online (Sandbox Code Playgroud)

我希望在"_stranslate"中看到

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

但得到了这个

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

有人能帮我吗?

shr*_*iek 13

尝试检查响应标头,内容类型告诉您应使用的编码.

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

所以只需添加此行即可.

client.Encoding = Encoding.GetEncoding(20866);
Run Code Online (Sandbox Code Playgroud)

要么

client.Encoding = Encoding.GetEncoding("KOI8-R");
Run Code Online (Sandbox Code Playgroud)

有关编码的完整列表可以在编码类的文档中找到

另一种方法是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);
Run Code Online (Sandbox Code Playgroud)

  • @Likurg:我再次编辑了我的答案,如果你必须处理许多不同的字符集,可能会有所帮助. (3认同)