やりたいこと
Windowsでむにゃむにゃする前提の(マルチバイト文字を含む)CSVを入出力したい
何も考えずに書いてみる
sample1.cs
// using System.IO
StreamWriter sw = new StreamWriter("hogehoge.csv", false);
sw.WriteLine("はろーわーるど");
sw.Close();
はい。
本題
StreamWriterクラスはコンストラクタでエンコーディングを指定することができます(Encodingクラス、System.Text名前空間)。指定しなければドキュメント曰く「既定のエンコーディング」となっており、手元の環境では "BOMなしの" utf-8になったためお約束の文字化けが起こった次第です。
じゃあshift-jisを指定すればいいだろという話なのですが、.NET Core 3.1ではshift-jisが標準でサポートされていません。
sample2.cs
// using System.IO
// using System.Text
StreamWriter sw1 = new StreamWriter("hogehoge.csv", false, Encoding.GetEncoding("utf-8"));
// -> OK
StreamWriter sw2 = new StreamWriter("hugahuga.csv", false, Encoding.GetEncoding("shift_jis"));
// -> 例外 ArgumentException: 'shift_jis' is not a supported encoding name.
ちなみに上のsw1のように明示的にutf-8エンコーディングを指定した場合は "BOM付きの" utf-8になります。Excelで読み込みたいだけとかならこれで問題ないですが、それはそれとしてエンコーディングにshift-jisを指定できないのは若干気持ち悪い。
どうも裸のままではどうしようもなさそうなので、以下パッケージを追加します。
terminal
> dotnet add package System.Text.Encoding.CodePages
で、
sample3.cs
// using System.IO
// using System.Text
EncodingProvider ep = CodePagesEncodingProvider.Instance;
StreamWriter sw = new StreamWriter("hogehoge.csv", false, ep.GetEncoding("shift-jis"));
sw.WriteLine("はろーわーるど");
sw.Close();