我在控制台的输出表情有问题。
字符串以Unicode标志"\u“开头很好,就像"\u263A"
一样。
但是,如果只是简单地将一个表情符号复制并粘贴到字符串中,比如""
,它就不能工作。
代码测试如下:
using System;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
string s1 = "";
string s1_uni = "\ud83c\udf81"; // unicode code for s1
string s2 = "☺";
string s2_uni = "\u263A"; // unicode code for s2
Console.WriteLine(s1);
Console.WriteLine(s1_uni);
Console.WriteLine(s2);
Console.WriteLine(s2_uni);
Console.ReadLine();
}
}
}
s1
和s1_uni
可以成功输出,而s2
和s2_uni
失败。
我想知道如何解决这个问题。
顺便说一下,应用的字体是“Consolas”,它在Visual中工作得很好。
更新:
请注意,在提出这个问题之前,我已经在堆栈溢出中做了一些搜索。最常见的方法是将控制台编码设置为utf-8
,,这是在第一行中完成的。
这种方式(Console.OutputEncoding = Encoding.UTF8
)不能完全符合我提出的情况。
此外,我在问题中补充控制台字体的原因是声明Consolas
字体在VS中显示表情符号时工作得很好,而在控制台中失败了。第一个表情符号没能显示出来.
请不要结束这个问题。谢谢。
Update2:
这个表情符号可以显示在VS终端上。
Update3:
谢谢彼得·杜尼霍的帮助。而且你是对的。
在我们讨论的时候,我浏览了一下MS 对控制台的Unicode支持的文档。
不支持在基本多语言平面(即代理项对)之外显示字符,即使它们是在链接的字体文件中定义的。
表情符号的代码点不能显示在控制台的BMP之外。控制台不支持BMP外部的显示代码点。因此,这个表情没有显示出来。
若要更改可能支持此表情符号的运行上下文,请执行以下操作。我做了一些实验。
CMD:
动力壳:
窗口终端:
您可以看到,windows终端支持它。
严格地说,我遇到的问题不是堆叠溢出的重复问题。因为我的代码只是做了一切可以做的事情来满足需求。问题在于正在运行的上下文,而不是代码。
谢谢彼得·杜尼霍的帮助。
发布于 2021-05-12 19:49:23
当前的Windows命令行控制台cmd.exe
仍然使用GDI+来呈现文本。而且它使用的GDI+ API不能正确处理组合/代理项对字符,比如您想要显示的表情符号。
即使使用包含所需字符的字形的字体,以及当您正确地将Console
类的输出编码设置为Unicode编码(这两者都在您的示例中完成)时,也是如此。
微软似乎正在对命令提示符代码进行改进,将其升级为使用DirectWrite API而不是GDI+。如果和当这些改进发布时,控制台窗口应该能够正确地显示您的表情符号。见Github发行版UTF-8渲染问题#75
同时,您可以在能够正确呈现这些字符的上下文中运行程序,例如Windows终端或PowerShell。
关于GDI+字体呈现限制的更多详细信息可以在将表情符号支持添加到Windows控制台#190和emoji/unicode支持在windows #2693中大部分被破坏中找到(后者本身并不是关于一个Windows组件,但仍然与这个问题有关)。
https://stackoverflow.com/questions/67508469
复制相似问题