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とりわけ、文字列を含む変数になります

「$κ$-ミンコフスキー空間、スカラー場、およびローレンツ不変性の問題」

ただし、FirefoxでそのURLにアクセスすると、

$κ$-ミンコフスキー空間、スカラー場、およびローレンツ不変性の問題

これは実際には正しいです。私も試しました

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には、OS言語設定に基づくANSIエンコーディングです。
svick 2011

回答:


201

嘘ではありません。DownloadStringを呼び出す前に、まず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");
}

代替手段が機能しない理由は、使用法が正しくないためです。その必要があります:

System.Text.Encoding.UTF8.GetString()

9
優れたありがとう!WebClientはこれを検出するためにヘッダーを使用しないのは不思議ですが、これは完全に機能します。あなたと@svickの間で、私が試した他のことも惨めに失敗した理由を理解しています。
ドメニック2011

1
以下のための作品UploadStringだけでなく
irfandar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.