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яка містить, серед іншого, рядок

"$ κ $ -простір Міньковського, скалярне поле та проблема інваріантності Лоренца"

Однак, коли я відвідую цю URL-адресу у Firefox, я отримую

$ κ $ -простір Міньковського, скалярне поле та проблема інваріантності Лоренца

що насправді правильно. Я теж намагався

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, що є кодуванням ANSI на основі мовних налаштувань ОС.
svick

Відповіді:


201

Це не брехня. Перш ніж викликати 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");
}

Що стосується того, чому ваша альтернатива не працює, це тому, що використання неправильне. Це повинно бути:

System.Text.Encoding.UTF8.GetString()

9
Чудово, дякую! Дивно, що the WebClientне використовує заголовки для виявлення цього, але це працює чудово, і між вами та @svick я розумію, чому інша річ, яку я спробував, теж зазнала невдачі.
Доменік

1
Працює UploadStringтакож
irfandar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.