やりたいこと
Windowsでむにゃむにゃする前提の(マルチバイト文字を含む)CSVを入出力したい
何も考えずに書いてみる
sample1.cs
// using System.IOStreamWritersw=newStreamWriter("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.TextStreamWritersw1=newStreamWriter("hogehoge.csv",false,Encoding.GetEncoding("utf-8"));// -> OKStreamWritersw2=newStreamWriter("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.TextEncodingProviderep=CodePagesEncodingProvider.Instance;StreamWritersw=newStreamWriter("hogehoge.csv",false,ep.GetEncoding("shift-jis"));sw.WriteLine("はろーわーるど");sw.Close();
