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

C# 将C控制台应用程序设置为Unicode输出,c#,unicode,console-application,C#,Unicode,Console Application,我有一个C控制台应用程序,我试图在其中做一些ASCII艺术。但是,我想使用的一些字符是Unicode。因此,我在internet/So上搜索,找不到关于如何在C控制台应用程序中将控制台设置为Unicode的统一答案 TDLR:如何将C控制台应用程序中的控制台设置为Unicode 编辑:在搜索与此问题无关的内容后,我确实找到了一些内容。结果表明,要使控制台显示Unicode字符,需要设置多个内容 将控制台设置为支持Unicode的字体。为此,请使用console.ReadKey运行一次C控制台应用

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

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


编辑:在搜索与此问题无关的内容后,我确实找到了一些内容。

结果表明,要使控制台显示Unicode字符,需要设置多个内容

将控制台设置为支持Unicode的字体。为此,请使用console.ReadKey运行一次C控制台应用程序;所以窗户一直开着。在窗口的标题栏上单击鼠标右键,然后选择“属性”。通过Visual Studio进行调试时,这些选项将保持不变。您可能需要使用默认菜单来在整个系统中持久化选项。在字体选项卡中,您需要将字体设置为Lucida Console。此字体支持Unicode字符。可以找到相关的帖子。 将控制台的代码页设置为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();
上面代码的第一部分将创建一个新的cmd.exe进程。提供给StartInfo的设置将确保控制台重定向到此新进程。代码的第二部分向这个控制台窗口发送命令并运行它。该命令chcp 65001将控制台的代码页设置为UTF-8。相关职位可以找到和

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

Console.OutputEncoding = Encoding.UTF8;
现在,控制台的任何输出都将使用Unicode。可以找到相关的帖子


就这样!我希望这些信息对某人有所帮助-

另一个选项是使用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;
    }
}
输出:


无法在.net framework上运行。bis可能是.net核心控制台中的一种东西吗?上面的代码是.net Framework。请注意,屏幕截图中的非ascii字符仅在控制台字体支持时显示。上面控制台中设置的字体为NSimSun。