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ą, text
któ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 WebClient
zawodzi w inny sposób? Co mogę zrobić, aby to złagodzić?
UTF8Encoding.Default
w rzeczywistościEncoding.Default
jest to kodowanie ANSI oparte na ustawieniach języka systemu operacyjnego.Odpowiedzi:
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()
źródło
WebClient
nie 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.UploadString
również