【備忘録】C#でShift-JISの文字列を扱う


Shift-JISの文字列を読み込むときに少しはまったので自分用の備忘録としてメモ。

よく見る"Shift-JIS"の文字列書き込み用のコード

通常、C#でテキストファイルなどへ文字コードを指定して書き込む場合は、
書き込みのストリーム生成時に文字コードを"System.Encoding"クラスを用いて指定します。

System.Encodingドキュメンテーション
https://docs.microsoft.com/ja-jp/dotnet/api/system.text.encoding?view=netcore-3.1

Shift-JISを使う場合、よく見かけるサンプルだとこんな感じで宣言してます。

CodeConverter.cs
StreamWriter writer = new StreamWriter(
    File.Open(@"C:\hogehoge.txt", FileMode.Create),
    Encoding.GetEncodings("shift-jis")
);

何が問題なのか?

このままビルドすると、下記のようなエラーが出ます。
※2020/5/1追記:.NET Frameworkでは標準でサポートされているのでこのエラーは出ませんし、本記事で取り上げている問題も起きません。

System.ArgumentException: ''SHIFT-JIS' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. '
(内容和訳)"SHIFT-JIS"はサポートされている文字コード名ではありません。任意の文字コードを指定する方法については、Encoding.RegisterProviderメソッドの資料を参照してください。

つまり、プロジェクト作り立ての状態では、Shift-JISの定義が含まれていないため、文字コード変換に失敗します。

(参考)何もしない状態でサポートされていた文字列
私の環境の場合、何もしない状態でサポートされていた文字コードは下記のみでした。
* "utf-16"
* "utf-16BE"
* "utf-32"
* "utf-32BE"
* "us-ascii"
* "iso-8859-1"
* "utf-7"
* "utf-8"

どうすればいいのか?

NuGetから必要なパッケージをインストールし、参照すれば解決します。

具体的な手順

(1)NuGetから"System.Text.Encoding.CodePages"をプロジェクトに追加する。

NuGet System.Text.Encoding.CodePagesプロジェクトページ
https://github.com/dotnet/corefx

(2)EncodingProviderクラスを宣言したのち、Shift-JISエンコードを読み込む。

CodeConverter.cs
EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
var encoding =  provider.GetEncoding("shift-jis");

(3) (2)で取得したエンコードをStreamのコンストラクタに渡す。

最初に挙げた「よく見るサンプル」を書き直すと下記の通りとなります。

CodeConverter.cs
EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
var encoding =  provider.GetEncoding("shift-jis");
StreamWriter writer = new StreamWriter(
    File.Open(@"C:\hogehoge.txt", FileMode.Create),encoding
);

修正記録

(a)2020/05/01 … .NET Frameworkでは標準でサポートされているようです。(情報をくださったalbireo様、ありがとうございました。)