我在控制台中输出表情符号时遇到问题。
\n以 Unicode 标志“\\u”开头的字符串效果很好,例如"\\u263A".
但是,如果只是简单地将表情符号复制并粘贴到字符串中,例如"",则不起作用。
代码测试如下:
\nusing 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\nRun Code Online (Sandbox Code Playgroud)\ns1且失败时s1_uni可以成功输出。s2s2_uni
我想知道如何解决这个问题。
\n顺便说一句,应用的字体是“Consolas”,在 Visual Studio 中完美运行。
更新:
\n请注意,在提出这个问题之前,我已经在 stackoverflow 中进行了一些搜索。最常见的方法是将控制台编码设置为utf-8,这是在 的第一行完成的Main。
这种方式(Console.OutputEncoding = Encoding.UTF8)不能完全符合我提出的情况。
另外,我在问题中对控制台字体进行补充的原因是声明该Consolas字体在 VS 中显示表情符号时完美,但在 console 中失败。第一个表情符号未能显示。
请不要关闭这个问题。谢谢。
\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可以看到,windows终端是支持的。
\n严格来说,我遇到的问题并不是stackoverflow中的重复问题。因为我的代码只是做了一切可以做的事情来满足要求。问题在于运行上下文,而不是代码。
\n感谢彼得·杜尼霍的帮助。
\n当前的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 #190和emoji/unicode supportmostly bad in windows #2693(后者与 Windows 组件本身无关,但仍然与这个问题有关)。