【C#】Shift-JISなど特定の文字コードでファイルを読み書きする

.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などで開いた際に文字化けする原因となります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次