1. ホーム
  2. .net

[解決済み] WebClient.DownloadString はエンコーディングの問題で文字化けしますが、ブラウザは問題ありません。

2023-04-20 05:39:26

質問

次のようなコードです。

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 は他の何らかの方法で失敗しているのでしょうか?これを軽減するためにはどうしたらよいでしょうか?

どのように解決するのですか?

嘘ではありません。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()