1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

.NET Coreでshift-jis出力

Posted at

やりたいこと

Windowsでむにゃむにゃする前提の(マルチバイト文字を含む)CSVを入出力したい

何も考えずに書いてみる

sample1.cs
// using System.IO

StreamWriter sw = new StreamWriter("hogehoge.csv", false);
sw.WriteLine("はろーわーるど");
sw.Close();

Excelくん
utf8excel.png

はい。

本題

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();

sjexcel.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?