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

.NETでShift-JISが使えなくて困ってませんか?今日はそんなあなたのために、C#とVB.NETでShift-JISを使えるようにする方法を分かりやすくお届けします!

「なんで使えないの?」「解決策はあるの?」とモヤモヤしているあなた、この記事を読めばスッキリするはず。というわけで、今回は 「Shift-JISが使えない!?」問題と、その 超シンプルな解決法について紹介します。


よくあるエラー:Shift-JISはサポートされていません

.NET Core や .NET 5 以降のアプリケーションで、こんなエラーに出くわしたことはありませんか?

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

うん、見たことある気がしますよね…。

このエラー、ざっくり言うと「その文字コード、今の.NETじゃ標準じゃないよ!」というメッセージなんです。


え、Shift-JISって使えないの?

「え!?Shift-JISって日本語の基本じゃないの?」と思った方、鋭いです。でも残念ながら、.NET Coreや.NET 5以降では軽量化のために、Shift-JISのような“レガシーな文字コード”がデフォルトでは使えなくなってるんです。

その代わり、UTF-8が推されています。

とはいえ、業務アプリやレガシーデータ、CSVファイルとのやり取りではまだまだShift-JISが現役だったりしますよね。特にWindowsの世界では根強い存在です。


解決策:CodePagesEncodingProviderを使おう!

そんなときに登場するのが、救世主的な存在
CodePagesEncodingProvider です!

これを使えば、Shift-JISどころかEUC-JPやISO-2022-JPなども使えるようになります。やったね!


C#での設定方法

では、まずC#から。以下のコードを見てください👇

using System;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        // Shift-JISを有効にする設定
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

        // Shift-JISエンコーディングを取得
        Encoding sjis = Encoding.GetEncoding("Shift-JIS");

        Console.WriteLine(sjis.EncodingName);
    }
}

この Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); の一文が大事です。ここを忘れると、また例の「サポートされてません!」エラーが飛んできます。


VB.NETでの設定方法

もちろんVB.NET派のあなたにも安心していただけるように、VB版もご用意しました!

Imports System.Text

Module Program
    Sub Main()
        ' Shift-JISを使うための設定
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

        ' Shift-JISエンコーディングを取得
        Dim sjis As Encoding = Encoding.GetEncoding("Shift-JIS")

        Console.WriteLine(sjis.EncodingName)
    End Sub
End Module

こちらも同じく RegisterProvider を最初に呼んであげるのがポイントです。


補足:なぜそもそも使えないの?

ここで「そもそもなんでShift-JISが外されたの?」という疑問にも触れておきますね。

それはズバリ、.NET Core 以降の思想が“軽量でモダン”だからです。

  • レガシーなエンコーディングは使用頻度が低い
  • 全世界での利用を考えるとUTF-8で統一したい
  • 少しでも無駄なリソースを減らしたい

といった理由で、Shift-JISなどの「昔ながらの文字コード」は標準から外れたんです。ちょっと寂しい話ですが、時代の流れというやつですね。


よくある質問(FAQ)

Q1. 他のエンコーディングも使えますか?

はい、使えます!
CodePagesEncodingProvider を登録すれば、以下のようなエンコーディングも有効になります:

  • EUC-JP
  • ISO-2022-JP
  • Windows-1252(欧州系)
  • などなど…

地味に便利です。


Q2. どの.NETバージョンで使えるの?

この方法が使えるのは以下のバージョンです:

  • .NET Core 3.0 以降
  • .NET 5, .NET 6, .NET 7, .NET 8…
  • .NET 6 のLTS(長期サポート)でももちろんOK

ちなみに .NET Framework(4.8以前)では設定不要 なので混乱しないでくださいね。


Q3. 毎回登録する必要がありますか?

はい、基本的にはアプリの「最初のほう」で一度だけ RegisterProvider を呼べばOKです。

Webアプリなら Startup.csProgram.cs の最初で呼びましょう。 デスクトップアプリなら Main() で呼んでおけば安心です。


応用:文字列のエンコードとデコード

せっかくなので、Shift-JISを使った文字列のエンコード例もご紹介します👇

C#版

string text = "こんにちは";
byte[] bytes = Encoding.GetEncoding("Shift-JIS").GetBytes(text);
string decoded = Encoding.GetEncoding("Shift-JIS").GetString(bytes);

Console.WriteLine(decoded); // こんにちは

VB.NET版

Dim text As String = "こんにちは"
Dim bytes As Byte() = Encoding.GetEncoding("Shift-JIS").GetBytes(text)
Dim decoded As String = Encoding.GetEncoding("Shift-JIS").GetString(bytes)

Console.WriteLine(decoded) ' こんにちは

Shift-JISが扱えるようになると、レガシーなCSV出力などにも安心して対応できます!


というわけで、まとめ!

  • .NET Coreや.NET 5以降では、Shift-JISはデフォルトで使えません。
  • でも大丈夫! CodePagesEncodingProvider を使えばすぐに有効化できます。
  • C#でもVB.NETでも、設定方法はとってもシンプル!
  • UTF-8で統一できれば理想だけど、現実はそんなに甘くない…という時のために覚えておくと吉。

Shift-JISのサポートで困っていた方は、ぜひこの方法を試してみてくださいね。


それでは今回はここまで。
読んでいただきありがとうございました!また次回の.NETお役立ち情報でお会いしましょう〜!