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

14

我有一个C#控制台应用程序,我想在它里面做一些ASCII艺术。然而,我想使用的一些字符是Unicode编码的。所以,我在搜索互联网/stackoverflow时没有找到一个综合的答案来设置控制台在C#控制台应用程序中为Unicode。

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

编辑:我在寻找与这个问题无关的东西时发现了这篇文章

3个回答

25

原来需要设置多个事项才能使控制台显示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();

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

  • 将输出编码设置为UTF-8。 这是Console.WriteLine实际输出Unicode字符的唯一方式。设置这个非常简单。

  • Console.OutputEncoding = Encoding.UTF8;
    

    现在,Console的任何输出都将是Unicode格式。相关帖子可以在这里找到。

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


    1
    如果您将 Console.InputEncodingConsole.OutputEncoding 都设置为 Encoding.UTF8,则代码页会在内部更改,因此无需启动进程 chcp - Gerardo Grignoli

    13

    另一个选项是使用 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 上工作。它可能是 .NET Core 控制台中的一件事吗? - boop
    上面的代码是 .Net Framework。请注意,非 ASCII 字符(如屏幕截图中所示)只有在控制台字体支持它时才会显示出来。上面控制台中设置的字体是 NSimSun。 - Cillié Malan
    这是我在尝试在控制台输出中获取阿拉伯字母时使用的解决方案(.NET 5在Windows上)。虽然我将值从65001更改为1256(阿拉伯编码代码页值)。 - Julie Lerman
    还要注意的是,控制台默认字体。这段代码导致控制台字体更改为支持阿拉伯字符的 Courier New 字体。 - Julie Lerman
    我更喜欢这个解决方案,因为它干净且对我来说可以直接使用(本质上相当于在启动我的C#应用程序之前在cmd.exe中运行“chcp 65001”)。 - David Airapetyan
    如果您要这样做,请在调用 System.Console 类中的任何方法之前执行。否则,它将初始化为其他编码。 - Gerardo Grignoli

    0
    我比较喜欢的解决方法是通过控制面板下的区域选项来将我的个人配置文件的活动控制台代码页更改为 utf-8。(见图片) 重新启动并选择一个可以显示必要字符的字体。

    Select this tickbox


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接