Shift-JIS を使った日本語テキストファイルの読み込み:.NET Framework から .NET Core への移行

はじめに

最近、.NET Framework から .NET Core および .NET 5+ への移行が進む中で、特に日本語を含むテキストファイルの読み込みにおいて、エンコーディングの設定が問題となることが少なくありません。従来の .NET Framework 環境では、Encoding.Default を使用することで日本語テキストファイルを簡単に読み取ることができました。しかし、.NET Core および .NET 5+ では、エンコーディングのデフォルト設定が異なるため、従来の方法では日本語が正しく表示されない場合があります。

ここでは.NET Framework プロジェクトから .NET Core/.NETへ移行する際にShift-JIS を使用して日本語テキストファイルを正しく読み込む方法を詳しく説明します。

前提条件

・開発環境:VisualStudio2022

・開発言語:VB.net

・開発時フレームワーク:.NET FrameWork 4.8

・移行先フレームワーク:NET Core 8.0

・・upgradeを使用してフレームワークを.NET Core8.0にしていること(詳しくはこちら)

詳細

.Net FrameWork 4.8で作成したプロジェクトを.Net Core 8.0にアップグレードしたもので規定のテキストファイル(.txt)を読み込ませたところ、文字化けが発生して上手く読み取れず「System.InvalidCastException」エラーが発生していた。

原因

.Net FrameWorkの名残で日本語を含むテキストファイルをEncoding.Defaultで読み込もうとしていたのがいけなかったようです。

以下のような状況でした。

Imports System.IO
Imports System.Text

Module Module1
    Sub Main()
        ' ファイル名を指定
        Dim fileName As String = "sample.txt"

        ' StreamReader の新しいインスタンスを生成 (既定のエンコーディングを使用)
        Using reader As New StreamReader(fileName, Encoding.Default)
            ' ファイルの内容を読み込み
            While Not reader.EndOfStream
                Dim line As String = reader.ReadLine()
                Console.WriteLine(line)
            End While
        End Using
    End Sub
End Module

.NET FrameworkではEncoding.Default を使用して、日本語のテキストファイルを読み取ることができます。これは、システムの既定のコードページが日本語(Shift-JIS や Windows-932)に設定されているためです。ただし、.Net Coreでは読み取れないようになっています。

解決策

①Nugetパッケージマネージャーから「System.Text.Encoding.CodePages」をインストールする

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)Encoding.GetEncoding("shift_jis")を使用してエンコーディングを明示的に指定する

※エンコーディング:文字や記号をコンピュータが理解できる形式に変換すること

Imports System.IO
Imports System.Text

Module Module1
    Sub Main()
        ' CodePagesEncodingProvider を登録
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

        ' ファイル名を指定
        Dim fileName As String = "sample.txt"

        ' StreamReader の新しいインスタンスを生成 (Shift-JIS エンコーディングを使用)
        Using reader As New StreamReader(fileName, Encoding.GetEncoding("shift_jis"))
            ' ファイルの内容を読み込み
            While Not reader.EndOfStream
                Dim line As String = reader.ReadLine()
                Console.WriteLine(line)
            End While
        End Using
    End Sub
End Module

各メソッドについて

 Encoding.GetEncoding(“shift_jis”)

 このメソッドは指定された名前またはコードページのエンコーディングを取得するために使用されます。

 具体的には、”shift_jis” という名前で指定されたエンコーディングを取得します。Shift-JIS は、日本語の文字をエンコードするために使用されるエンコーディングです。

 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

 このメソッドは、特定のエンコーディングプロバイダーを登録するために使用されます。

 .NET Core および .NET 5+ では、Shift-JIS などの一部のエンコーディングはデフォルトではサポートされていません。

 このため、CodePagesEncodingProvider を登録することで、これらのエンコーディングを利用可能にします。

まとめ

.NET Frameworkから.NET Coreへの移行時に、日本語を含むテキストファイルの読み込みで発生するエンコーディングの問題は、System.Text.Encoding.CodePagesのインストールと適切なエンコーディングの指定で解決できます。この記事で紹介した手順に従い、移行プロセスをスムーズに進め、文字化けのない正確な日本語テキストファイルの読み込みを実現してください。また、移行後も定期的にプロジェクトのメンテナンスを行い、最新の情報を取り入れることが重要です。