📘

C#でコンソール出力時の文字エンコーディングを制御する

2023/01/31に公開

C#を使ってコマンドラインアプリケーションを作っていた時に、特定のコンソールに対して文字化けが発生するという現象に見舞われました。
出力する文字列の文字エンコーディングと、それを表示するコンソールが対応している文字エンコーディングに不一致があると文字化けしますが、今回の原因もこれでした。
コンソール出力時の文字エンコーディングを明示的に指定することで解消したため、そのときに調べたことをまとめます。
なお、本稿では .NET 6 を対象としています。

Console.OutputEncoding に文字エンコーディングを指定する

C#でコンソール出力するとき、Console.WriteLine等を呼び出しますが、ConsoleクラスにOutputEncodingプロパティが存在します。これに所望の文字エンコーディングを指定すれば、目的を達成できそうです。
なので、コードはとても簡単です。

Console.OutputEncoding = Encoding.GetEncoding("utf-8");

// UTF-8でエンコーディングして出力する
Console.WriteLine("こんにちは、世界!");
// UTF-8のコードページ"65001"を出力する
Console.WriteLine(Console.OutputEncoding.CodePage);

Windows環境だと、Shift-JIS ⇔ UTF-8 間の不一致で悩まされるケースが多いのではないかと思いますが、UTF-8を指定して検証してみたところ、以下の環境では文字化けなく表示されました。

  • PowerShell v5.1
  • コマンドプロンプト

最近はUTF-8がスタンダートになりつつあるので、UTF-8を指定しておけば大抵の場合は問題ないのではないでしょうか。

まとめ

C#のコマンドラインアプリケーションで文字エンコーディングを指定するには、Console.OutputEncodingプロパティを設定すればよいです。
文字化けが発生したら、とりあえず文字エンコーディング疑いましょう。

Discussion