この質問の背後には多くの歴史があります。まず、それについて少し説明します。コンソール モード アプリは、8 ビットのテキスト エンコーディングでのみ動作します。これは、42 年前に Ken Thompson らが Unix を設計したときに行った設計上の決定にまでさかのぼります。端末 I/O がパイプを介して行われるという Unix のコア機能で、パイプを連鎖させて、あるプログラムの出力を別のプログラムの入力に供給することができました。この機能は Windows でも実装されており、.NET および ProcessStartInfo.RedirectStandardXxxx プロパティでサポートされています。
素晴らしい機能ですが、オペレーティング システムが Unicode を採用し始めたときに問題になりました。Windows NT は、そのコアが完全に Unicode である最初のものでした。Unicode 文字は常にエンコードする必要があります。当時の一般的な選択は UCS で、後に utf-16 にモーフィングされました。現在、I/O リダイレクトに問題があります。16 ビットでエンコードされた文字を吐き出すプログラムは、8 ビットでエンコードされた文字をまだ使用しているプログラムにリダイレクトされると、うまく動作しません。
Ken Thompson も、この問題の解決策を見つけた功績により、utf-8 エンコーディングを発明しました。
これは Windows でも機能します。コンソール モード アプリで簡単に実行できます。Console.OutputEncoding プロパティを再割り当てする必要があります。
using System;
using System.Text;
class Program {
static void Main(string[] args) {
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine("Ĥėļŀō ŵŏŗłđ");
Console.ReadLine();
}
}
ただし、別の問題が発生します。コンソール ウィンドウ用に選択されたフォントでは、テキストをレンダリングできない可能性があります。Alt+Space を押して、システム メニュー、[プロパティ]、[フォント] タブを呼び出します。非ラスター フォントを選択する必要があります。ピッキングは非常にスリムで、Vista 以降では Consolas を選択できます。プログラムを再実行すると、アクセント付きの文字が正しく表示されるはずです。残念ながら、コンソール フォントをプログラムで強制するのは問題です。この構成手順を文書化する必要があります。さらに、Consolas のようなフォントには、可能な Unicode グリフの完全なセットがありません。グリフがない Unicode コードポイントに四角形が表示される可能性があります。GUI プログラムを作成することが本当に最善の策であることを思い起こさせてくれます。