2011-08-21 5 views
71

Các mã sau đây:kết quả WebClient.DownloadString bằng ký tự đã bị đọc sai do các vấn đề mã hóa, nhưng trình duyệt là OK

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

kết quả trong một biến text chứa, trong số rất nhiều những thứ khác, chuỗi

"không gian $ κ $ -Minkowski, trường vô hướng, và vấn đề Lorentz bất biến"

Tuy nhiên, khi tôi truy cập URL trong Firef bò, tôi nhận được

$ κ gian $ -Minkowski, trường vô hướng, và vấn đề Lorentz bất biến

mà thực sự là chính xác. Tôi cũng đã thử

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); 

nhưng điều này cũng có cùng một vấn đề.

Tôi không chắc nơi lỗi xảy ra ở đây. Là nguồn cấp dữ liệu nằm về được mã hóa UTF8 và trình duyệt đủ thông minh để tìm ra điều đó, nhưng không phải là WebClient? Nguồn cấp dữ liệu có được mã hóa UTF8 đúng cách hay không, nhưng WebClient không hoạt động theo một cách khác? Tôi có thể làm gì để giảm thiểu điều này?

+5

'UTF8Encoding.Default' thực sự là' Encoding.Default', là mã hóa ANSI dựa trên cài đặt ngôn ngữ hệ điều hành. – svick

Trả lời

156

Nó không nói dối. Bạn nên đặt mã hóa webclient trước khi gọi cho DownloadString.

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"); 
} 

Vì lý do thay thế của bạn không hoạt động, đó là do việc sử dụng không chính xác. Nó phải là:

System.Text.Encoding.UTF8.GetString() 
+7

Tuyệt vời, cảm ơn bạn! Kỳ lạ là 'WebClient' không sử dụng tiêu đề để phát hiện điều này, nhưng điều này hoạt động hoàn hảo, và giữa bạn và @svick, tôi hiểu tại sao điều khác mà tôi đã thử cũng thất bại thảm hại. – Domenic

+0

Hoạt động cho 'Tải lênString' – lostmylogin