タグ: Encoding

  • [C#,VB.NET]サポートされていないShift-JISエンコーディングのエラーとその解決方法

    はじめに

    .NET Coreや.NET 5+以降の環境で、Shift-JIS(日本語エンコーディング)を使用しようとすると、次のようなエラーが発生することがあります。

    System.ArgumentException: 'Shift-JIS' is not a supported encoding name.

    これは、.NET Coreや新しい.NETランタイムでは、Shift-JISなどの特定のエンコーディングがデフォルトではサポートされていないためです。しかし、CodePagesEncodingProviderを使用して、これらのエンコーディングを有効にすることができます。

    この記事では、C#とVB.NETでの解決方法を解説します。

    エラーの原因

    従来の.NET FrameworkではShift-JISエンコーディングがデフォルトでサポートされていましたが、.NET Coreや.NET 5+では軽量化とパフォーマンスの向上を目的に、デフォルトのエンコーディングサポートが制限されています。そのため、Shift-JISなどのコードページベースのエンコーディングを使用する場合は、明示的にサポートを有効にする必要があります。

    解決方法

    Step 1: CodePagesEncodingProviderの登録

    エンコーディングを有効にするために、アプリケーションの初期化時にCodePagesEncodingProviderを登録します。これにより、Shift-JISを含む多くのエンコーディングが利用可能になります。

    C#での実装

    C#では、次のようにしてShift-JISエンコーディングを有効にできます。

    using System;
    using System.Text;
    
    class Program
    {
        static void Main(string[] args)
        {
            // CodePagesEncodingProviderを登録してShift-JISを有効にする
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    
            // Shift-JISエンコーディングを取得
            Encoding encoding = Encoding.GetEncoding("Shift-JIS");
    
            // 以下でShift-JISエンコーディングが利用可能です。
        }
    }
    

    VB.NETでの実装

    VB.NETでは、同様にCodePagesEncodingProviderを登録することで、Shift-JISをサポートします。

    Imports System.Text
    
    Module Program
        Sub Main()
            ' Shift-JISをサポートするためのエンコーディングプロバイダを登録
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
    
            ' Shift-JISエンコーディングを取得
            Dim encoding As Encoding = Encoding.GetEncoding("Shift-JIS")
    
        ' 以下でShift-JISエンコーディングが利用可能です。
        End Sub
    End Module
    

    コードの説明

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

    この一行がポイントです。CodePagesEncodingProvider.InstanceEncoding.RegisterProviderに渡すことで、Shift-JISを含む追加のコードページベースのエンコーディングがサポートされるようになります。このメソッドを呼ばなければ、Shift-JISを使おうとした際に、ArgumentExceptionが発生します。

    Encoding.GetEncoding("Shift-JIS")

    GetEncodingメソッドでShift-JISエンコーディングを取得します。このメソッドはエンコーディングの名前を引数として受け取り、そのエンコーディングを使用するオブジェクトを返します。

    よくある質問 (FAQ)

    1. なぜShift-JISがデフォルトでサポートされていないのですか?

    .NET Coreや.NET 5+では、軽量かつ高速なランタイムを目指しており、一般的でないエンコーディングはデフォルトで省かれています。日本語環境でよく使われるShift-JISもその一部です。

    2. Encoding.GetEncodingで他のエンコーディングも使用できますか?

    はい、CodePagesEncodingProviderを登録すれば、Shift-JIS以外にもEUC-JPやISO-2022-JPなど、さまざまなエンコーディングが使用可能です。

    3. すべての.NETバージョンでこの方法は使えますか?

    この解決方法は、.NET Core 3.0以降および.NET 5+で利用可能です。従来の.NET Frameworkでは、特にエンコーディングプロバイダの登録は不要です。

    まとめ

    .NET Coreや.NET 5+では、Shift-JISエンコーディングを使用するためにCodePagesEncodingProviderの登録が必要です。C#やVB.NETでShift-JISを利用する場合、アプリケーションの初期化時にこのプロバイダを登録することで、スムーズにエンコーディングを使えるようになります。

    Shift-JISエンコーディングの対応に困っている方は、ぜひこの記事の方法を試してみてください。