WebClient.DownloadString由于编码问题而导致字符变形,但浏览器正常


85

如下代码:

var text = (new WebClient()).DownloadString("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20"));

产生一个变量text,其中包含字符串

“ $β$ -Minkowski空间,标量场和洛伦兹不变性问题”

但是,当我在Firefox中访问该URL时,

$κ$ -Minkowski空间,标量场和洛伦兹不变性问题

这实际上是正确的。我也试过

var data = (new WebClient()).DownloadData("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20");
var text = System.Text.UTF8Encoding.Default.GetString(data);

但这带来了同样的问题。

我不确定问题出在哪里。提要是否在于对UTF8进行编码,并且浏览器足够聪明以至于可以识别出来,但事实并非如此WebClient?提要是否经过正确的UTF8编码,但是WebClient以其他方式失败了?我该怎么做才能减轻这种情况?


6
UTF8Encoding.Default实际上是Encoding.Default,这是基于OS语言设置的ANSI编码。
svick

Answers:


201

没说谎 在调用DownloadString之前,您应该先设置Web客户端的编码。

using(WebClient webClient = new WebClient())
{
webClient.Encoding = Encoding.UTF8;
string s = webClient.DownloadString("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20");
}

至于为什么您的替代方法不起作用,是因为用法不正确。它应该是:

System.Text.Encoding.UTF8.GetString()

9
非常好,谢谢!奇怪的是,它们WebClient不使用标头来检测到此错误,但是这样做很正常,而且在您和@svick之间,我理解为什么我尝试的另一件事同样失败了。
多米尼克

1
作品UploadString以及
irfandar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.