WebClient.DownloadString powoduje zniekształcone znaki z powodu problemów z kodowaniem, ale przeglądarka działa poprawnie

85

Poniższy kod:

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

daje w wyniku zmienną, textktóra zawiera między innymi ciąg

„$ κ $ -Przestrzeń Minkowskiego, pole skalarne i kwestia niezmienności Lorentza”

Jednak kiedy odwiedzam ten adres URL w przeglądarce Firefox, otrzymuję

$ κ $ -Przestrzeń Minkowskiego, pole skalarne i kwestia niezmienniczości Lorentza

co jest rzeczywiście poprawne. Ja też próbowałem

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

ale to spowodowało ten sam problem.

Nie jestem pewien, gdzie leży tu wina. Czy kanał kłamie, że jest zakodowany w UTF8, a przeglądarka jest wystarczająco inteligentna, aby to zrozumieć, ale nie WebClient? Czy kanał jest poprawnie zakodowany w UTF8, ale WebClientzawodzi w inny sposób? Co mogę zrobić, aby to złagodzić?

Domenic
źródło
6
UTF8Encoding.Defaultw rzeczywistości Encoding.Defaultjest to kodowanie ANSI oparte na ustawieniach języka systemu operacyjnego.
svick

Odpowiedzi:

201

To nie kłamie. Przed wywołaniem DownloadString należy ustawić kodowanie klienta sieci 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");
}

Jeśli chodzi o to, dlaczego Twoja alternatywa nie działa, to dlatego, że użycie jest nieprawidłowe. Powinien być:

System.Text.Encoding.UTF8.GetString()
LostInComputer
źródło
9
Wspaniale, dziękuję! Dziwne, że WebClientnie używa nagłówków do wykrycia tego, ale działa to doskonale, a między tobą a @svick rozumiem, dlaczego inna rzecz, której próbowałem, również zawodziła.
Domenic
1
Działa UploadStringrównież
irfandar