Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9699

.NET Coreでshift-jis出力

$
0
0

やりたいこと

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

何も考えずに書いてみる

sample1.cs
// using System.IOStreamWritersw=newStreamWriter("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.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();

sjexcel.png


Viewing all articles
Browse latest Browse all 9699

Trending Articles