.NET Core (.NET 5以降含む) では、デフォルトで Shift-JIS などのレガシーな文字コードがサポートされていません。 そのため、Shift-JIS を扱うには、追加のエンコーディングプロバイダーを登録(RegisterProvider)する手順が必要です。
ここでは、Shift-JIS (cp932) を指定してテキストファイルを書き込み、それを読み込む実装方法を解説します。
実装サンプル
以下のコードでは、Shift-JIS エンコーディングを使用して、日本語の文字列をファイルに保存し、その後読み出して表示しています。
サンプルコード
※ .NET Core / .NET 5+ で実行する場合、事前に NuGet パッケージ System.Text.Encoding.CodePages の参照が必要になることがあります。
using System;
using System.IO;
using System.Text;
public class Program
{
public static void Main()
{
// 書き込むデータ
var lines = new string[]
{
"あいうえお",
"かきくけこ",
"Shift-JISでの書き込みテスト"
};
string filePath = "sjis_test.txt";
// 1. Shift-JISを利用可能にするための「おまじない」
// .NET Core以降では、これを呼ばないとShift-JIS取得時にエラーになります
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// 2. Shift-JISのEncodingオブジェクトを取得
Encoding sjis = Encoding.GetEncoding("Shift_JIS");
Console.WriteLine("--- 書き込み開始 ---");
// 3. 指定した文字コードで書き込む (StreamWriter)
// 第2引数 false: 上書きモード (trueなら追記)
// 第3引数 sjis : 文字コードを指定
using (var sw = new StreamWriter(filePath, false, sjis))
{
foreach (var line in lines)
{
sw.WriteLine(line);
}
}
Console.WriteLine("書き込み完了。\n");
Console.WriteLine("--- 読み込み開始 ---");
// 4. 指定した文字コードで読み込む (StreamReader)
// 第2引数に文字コードを渡さないと、UTF-8として読まれて文字化けします
using (var sr = new StreamReader(filePath, sjis))
{
while (!sr.EndOfStream)
{
// 1行ずつ読み取って表示
string line = sr.ReadLine();
Console.WriteLine(line);
}
}
}
}
実行結果
--- 書き込み開始 ---
書き込み完了。
--- 読み込み開始 ---
あいうえお
かきくけこ
Shift-JISでの書き込みテスト
解説と技術的なポイント
1. CodePagesEncodingProvider の登録
昔の .NET Framework と異なり、現在の .NET はファイルサイズ削減のため、標準では UTF-8 や UTF-16 などの主要なUnicodeしか持っていません。 Shift-JIS や EUC-JP を使うには、プログラムの開始時に一度だけ以下を実行して、機能を追加する必要があります。
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
2. Encoding.GetEncoding(“Shift_JIS”)
登録が済んでいれば、このメソッドで Shift-JIS 用のエンコーディングオブジェクトを取得できます。文字列で "Shift_JIS" またはコードページ番号 932 を指定します。
3. StreamWriter / StreamReader への指定
コンストラクタの引数でエンコーディングオブジェクトを渡すことで、指定した文字コードでの入出力が行われます。ここを指定し忘れると、デフォルトの UTF-8 で処理されてしまい、Excelなどで開いた際に文字化けする原因となります。
