C# - WebClient.DownloadString不检测响应编码

时间:2015-12-15 07:49:14

标签: c# encoding webclient content-type

当我在使用WebClient课程时,我注意到像这样的简单调用

string downloadedString = new WebClient().DownloadString("http://whatever");

使用不正确的编码生成了一个字符串,即使该响应包含正确的Content-Type标题application/json; charset=utf-8

当我查看source code时,我发现DownloadString根本没有看到响应标头。相反,它使用request.ContentType,如果那里不存在字符集,它使用Encoding属性(必须事先设置,否则它将是系统的默认值)。

我们必须在发送请求之前专门告诉WebClient对象使用哪种编码(通过添加Content-Type标头或直接设置编码),这似乎很奇怪。使用DownloadString变得毫无意义:如果我们想要正确的编码,我们必须使用DownloadData或普通的旧WebRequest并编写手动解析响应头的代码以获得正确的响应字符串。

有谁知道这种行为的原因? .NET是否有更好的方法来正确下载HTTP字符串响应,而不是手动解析响应Content-Type

1 个答案:

答案 0 :(得分:1)

WebClient source code似乎表示当您致电DownloadString时,它会使用请求内容类型作为响应的编码,是奇怪的,可能是一个错误。

请参阅this excellent answer一个类似的问题。它包含使用DownloadData获取响应的代码,然后使用正确的编码将其转换为字符串,如响应的Content-Type标头中所指定。