mogmo .NET

C#/XAML/VB6たまにC++についてメモ程度に書いていく。あくまで自分用。責任は取れません。

.NET CoreでShift JISを扱うためのおまじない

.NET Frameworkでは問題なく扱えるが,
.NET Coreの場合はひと手間加えてやらないとShift JISが扱えない

ひと手間加えないとどうなるか

using (var reader = new StreamReader(file, System.Text.Encoding.GetEncoding("Shift_JIS")))
{
    // ...
}

このコードだと,ビルドは通るが,実行時に以下のような例外が発生する。

ArgumentException: 'shift_jis' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

原因

.NET CoreはASCIIとUnicodeのみエンコーディングをサポートしているため,Shift JISなんて扱ってないよ!って言われてしまう

対策

Encoding.RegisterProviderをShift JISを扱う前にコールすることで,Windowsのシステムが提供するエンコーディングの全てを利用できるようになる。

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // memo: Shift-JISを扱うためのおまじない

using (var reader = new StreamReader(file, System.Text.Encoding.GetEncoding("Shift_JIS")))
{
    // ...
}

それではまた。
written by @mogmo1012