如何在 C# 控制台输出中显示表情符号?

uca*_*cag 10 c#

我在控制台中输出表情符号时遇到问题。

\n

以 Unicode 标志“\\u”开头的字符串效果很好,例如"\\u263A".

\n

但是,如果只是简单地将表情符号复制并粘贴到字符串中,例如"",则不起作用。

\n

代码测试如下:

\n
using System;\nusing System.Text;\n\nnamespace Test\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n\n            Console.OutputEncoding = Encoding.UTF8;\n            string s1 = "";\n            string s1_uni = "\\ud83c\\udf81"; // unicode code for s1\n            string s2 = "\xe2\x98\xba";\n            string s2_uni = "\\u263A"; // unicode code for s2\n            Console.WriteLine(s1);\n            Console.WriteLine(s1_uni);\n            Console.WriteLine(s2);\n            Console.WriteLine(s2_uni);\n            Console.ReadLine();\n        }\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

s1且失败时s1_uni可以成功输出。s2s2_uni

\n

我想知道如何解决这个问题。

\n

顺便说一句,应用的字体是“Consolas”,在 Visual Studio 中完美运行。在此输入图像描述

\n

更新:

\n

请注意,在提出这个问题之前,我已经在 stackoverflow 中进行了一些搜索。最常见的方法是将控制台编码设置为utf-8这是在 的第一行完成的Main

\n

这种方式(Console.OutputEncoding = Encoding.UTF8)不能完全符合我提出的情况。

\n

另外,我在问题中对控制台字体进行补充的原因是声明该Consolas字体在 VS 中显示表情符号时完美,但在 console 中失败第一个表情符号未能显示。

\n

请不要关闭这个问题。谢谢。

\n

更新2:

\n

这个表情符号可以在VS终端中显示。

\n

在此输入图像描述

\n

更新3:

\n

感谢彼得·杜尼霍的帮助。你是对的。

\n

当我们讨论时,我浏览了文档 MS Unicode Support for the Console

\n
\n

不支持显示基本多语言平面之外的字符(即代理对),即使它们是在链接的字体文件中定义的。

\n
\n

表情符号的代码点无法显示在控制台中,位于 BMP 之外。并且控制台不支持显示 BMP 之外的代码点。因此,这个表情符号不会显示。

\n

更改可能支持此表情符号的运行上下文。我做了一些实验。

\n

命令:\n在此输入图像描述

\n

电源外壳:\n在此输入图像描述

\n

Windows 终端:\n在此输入图像描述

\n

可以看到,windows终端是支持的。

\n

严格来说,我遇到的问题并不是stackoverflow中的重复问题。因为我的代码只是做了一切可以做的事情来满足要求。问题在于运行上下文,而不是代码。

\n

感谢彼得·杜尼霍的帮助。

\n

Pet*_*iho 9

当前的Windows命令行控制台cmd.exe仍然使用GDI+来渲染文本。它使用的 GDI+ API 无法正确处理组合/代理对字符,例如您要显示的表情符号。

即使当使用包含所需字符字形的字体时,甚至当您已将类的输出编码正确设置为ConsoleUnicode 编码(这两种情况您在示例中都已完成)时,情况也是如此。

微软似乎正在致力于改进命令提示符代码,将其升级为使用 DirectWrite API 而不是 GDI+。如果这些改进发布,控制台窗口应该能够正确显示您的表情符号。请参阅 Github 问题UTF-8 渲染问题 #75

同时,您可以在能够正确呈现这些字符的上下文中运行程序,例如 Windows 终端或 PowerShell。

有关 GDI+ 字体渲染限制的更多详细信息,请参阅 Github issues Add emoji support to Windows Console #190emoji/unicode supportmostly bad in windows #2693(后者与 Windows 组件本身无关,但仍然与这个问题有关)。