📘
C#でコンソール出力時の文字エンコーディングを制御する
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