2020年2月11日火曜日

.NetCoreでEncoding.GetEncodingが動作しない

以前作成したアプリの一部の機能を独立して動かせるように、クラスライブラリからexeに変更しました。
合わせてフレームワークを.NetFramework4.6.1から.NetCore3.1に変更しました。

その際にHttpClient関連で不具合が発生し、エラーが発生するようになりました。

The character set provided in ContentType is invalid. Cannot read content as string using an invalid character set.

以下のソースでエラーが発生していました。
var res = await client.GetAsync(url);
var src = await res.Content.ReadAsStringAsync();

ここの、ReadAsStringAsyncでエラーとなってしまいました。
この書き方がダメみたいですね。


以下のように修正しました。
var res = await client.GetAsync(url);
string src;
using (var sr = new StreamReader(await res.Content.ReadAsStreamAsync(), Encoding.GetEncoding("euc-jp")))
{
    src = sr.ReadToEnd();
}

これでもさらにエラーが出ます。
System.ArgumentException: 'euc-jp' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
Parameter name: name


エラーの状況は違うようですが、以下のサイトを参考に修正します。
参考)ASP.NET CoreでShift_JISでCSV出力しようとしたら他ページのHTMLの中身が空になった件

.NetCoreではEncoding.GetEncodingは"shift_jis"や"euc-jp"はそのままでは使用できないそうです。
使用するには「CodePagesEncodingProvider」をNugetから追加します。

さらに、コンストラクタなどに以下を追加します。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

これで、正常に動作するようになりました。