将C#控制台应用程序设置为Unicode输出

Mic*_*nni 6 c# unicode console-application

我有一个C#控制台应用程序,我试图在其中做一些ASCII艺术.但是,我想要使用的一些字符是Unicode.所以,我正在搜索互联网/ SO,并找不到关于如何在C#控制台应用程序中将控制台设置为Unicode的综合答案.

TDLR:如何将C#控制台应用程序中的控制台设置为Unicode?

编辑:我在搜索与此问题无关的内容后确实找到了这篇文章.

Mic*_*nni 12

事实证明,为了使控制台显示Unicode字符,您需要设置多项内容.

  1. 将控制台设置为Unicode支持的字体.要执行此操作,请运行一次C#控制台应用程序,以Console.ReadKey();使窗口保持打开状态.右键单击窗口的标题栏,然后选择" 属性".通过Visual Studio进行调试时,这些选项将保持不变.您可能需要使用"默认"菜单来保留整个系统中的选项.在" 字体"选项卡中,您需要将字体设置为Lucida Console.此字体支持Unicode字符.相关的帖子可以在这里找到.
  2. 将控制台的代码页设置为UTF-8.这个有点棘手.因为,您必须在控制台窗口中执行命令才能更改代码页.无论出于何种原因,此选项不可用作控制台首选项.为此,您需要创建一个单独的cmd.exe进程,并使用它而不是提供的普通控制台.

    var cmd = new Process
    {
        StartInfo =
        {
            FileName = "cmd.exe",
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            CreateNoWindow = true,
            UseShellExecute = false
        }
    };
    cmd.Start();
    
    cmd.StandardInput.WriteLine("chcp 65001");
    cmd.StandardInput.Flush();
    cmd.StandardInput.Close();
    
    Run Code Online (Sandbox Code Playgroud)

    上面代码的第一部分将创建一个新cmd.exe进程.为StartInfo提供的设置将确保Console重定向到此新进程.代码的第二部分向该控制台窗口发送命令并运行它.该命令chcp 65001将控制台的代码页设置为UTF-8.相关帖子可以在这里这里找到.

  3. 将OutputEncoding设置为UTF-8.这是Console.WriteLine实际输出Unicode字符的唯一方法.设置这个非常简单.

    Console.OutputEncoding = Encoding.UTF8;
    
    Run Code Online (Sandbox Code Playgroud)

    现在,任何输出Console都将使用Unicode.相关的帖子可以在这里找到.

就是这样了!我希望这些信息有助于某人.:-)


Cil*_*lan 6

另一种选择是使用 P/Invoke 直接更改代码页:

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleOutputCP(uint wCodePageID);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleCP(uint wCodePageID);

    static async Task<int> Main(string[] args)
    {
        SetConsoleOutputCP(65001);
        SetConsoleCP(65001);

        Console.WriteLine("This is how you say hello in Japanese: ?????");

        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

控制台中的日语字符