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

Set C# console application to Unicode output

我有一个 C# 控制台应用程序,我试图在其中做一些 ASCII 艺术。但是,我想使用的一些字符是 Unicode。因此,我在搜索 internet/SO 时找不到关于如何在 C# 控制台应用程序中将控制台设置为 Unicode 的统一答案。

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

编辑:我在搜索与此问题无关的内容后确实找到了 this post

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

  1. 将控制台设置为支持 Unicode 的字体。 为此,运行 你的 C# 控制台应用程序一次 Console.ReadKey(); 所以 window 保持开放。右击window和selectProperties的标题栏。通过 Visual Studio 进行调试时,这些选项将持续存在。 您可能需要使用默认菜单来代替在整个系统中保留选项。字体选项卡中,您需要将字体设置为Lucida Console。此字体支持 Unicode 字符。相关的post可以在here.
  2. 中找到
  3. 将控制台的代码页设置为 UTF-8。 这个有点棘手。因为,你必须在控制台window中执行命令来更改代码页。无论出于何种原因,此选项都不能作为控制台首选项使用。为此,您需要创建一个单独的 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();
    

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

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

    Console.OutputEncoding = Encoding.UTF8;
    

    现在,Console 的任何输出都将采用 Unicode。相关的post可以在here.

  5. 中找到

所以,就是这样!我希望这些信息对某人有所帮助。 :-)

另一种选择是使用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;
    }
}

输出:

我更喜欢的解决方案是使用控制面板下的区域将配置文件的活动控制台代码页更改为 utf-8。 (见图) 重新启动并select一个可以显示必要字符的字体。