我有一个C#控制台应用程序,我想在它里面做一些ASCII艺术。然而,我想使用的一些字符是Unicode编码的。所以,我在搜索互联网/stackoverflow时没有找到一个综合的答案来设置控制台在C#控制台应用程序中为Unicode。
TDLR:如何将C#控制台应用程序中的控制台设置为Unicode?
编辑:我在寻找与这个问题无关的东西时发现了这篇文章。
我有一个C#控制台应用程序,我想在它里面做一些ASCII艺术。然而,我想使用的一些字符是Unicode编码的。所以,我在搜索互联网/stackoverflow时没有找到一个综合的答案来设置控制台在C#控制台应用程序中为Unicode。
TDLR:如何将C#控制台应用程序中的控制台设置为Unicode?
编辑:我在寻找与这个问题无关的东西时发现了这篇文章。
原来需要设置多个事项才能使控制台显示Unicode字符。
Console.ReadKey();
让窗口保持打开状态。右键单击窗口的标题栏,选择属性。这些选项将在通过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设置的参数将确保Console
被重定向到这个新的进程。代码的第二部分发送一个命令到这个控制台窗口并运行它。那个命令chcp 65001
,将控制台的代码页设置为UTF-8。相关帖子可以在这里和这里找到。
将输出编码设置为UTF-8。 这是Console.WriteLine
实际输出Unicode字符的唯一方式。设置这个非常简单。
Console.OutputEncoding = Encoding.UTF8;
现在,Console
的任何输出都将是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;
}
}
输出:
Console.InputEncoding
和Console.OutputEncoding
都设置为Encoding.UTF8
,则代码页会在内部更改,因此无需启动进程chcp
。 - Gerardo Grignoli