WebClient.DownloadString dẫn đến các ký tự bị lệch do sự cố mã hóa, nhưng trình duyệt vẫn ổn


85

Đoạn mã sau:

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

kết quả là một biến textchứa, trong số nhiều thứ khác, chuỗi

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

Tuy nhiên, khi tôi truy cập URL đó trong Firefox, tôi nhận được

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

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 đã đưa ra cùng một vấn đề.

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


6
UTF8Encoding.Defaultthực tế Encoding.Defaultlà mã hóa ANSI dựa trên cài đặt ngôn ngữ hệ điều hành.
svick

Câu trả lời:


201

Nó không nói dối. Bạn nên đặt mã hóa của webclient trước khi gọi 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 tại sao giải pháp thay thế của bạn không hoạt động, đó là do cách sử dụng không đúng. Nó phải là:

System.Text.Encoding.UTF8.GetString()

9
Tuyệt vời cảm ơn bạn! Kỳ lạ là cái WebClientkhô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

1
Công trình cho UploadStringcũng
irfandar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.