.NET 9发布exe后Windows Terminal中Emoji显示异常求助
问题原因分析
这个问题的核心是单文件发布的.NET控制台应用未默认设置控制台输出编码为UTF-8,而dotnet run模式下SDK自动适配了终端的UTF-8编码,导致两者行为不一致:
- 使用
dotnet run时,.NET SDK会自动将控制台输出编码设置为UTF-8(匹配Windows Terminal的默认编码),Emoji字符能被正确渲染。 - 发布为单文件EXE后,应用启动时没有自动继承终端的UTF-8编码,系统会 fallback 到Windows默认的传统代码页(比如GBK、CP1252等),这些编码不支持Emoji字符,因此显示为
?。
即使添加--no-self-contained参数,单文件发布的初始化逻辑仍会跳过SDK的编码自动配置步骤,所以问题依然存在。
验证与修复方案
在代码开头添加强制设置输出编码的逻辑,即可解决问题:
using System.Text; // 强制设置控制台输出编码为UTF-8 Console.OutputEncoding = Encoding.UTF8; const string CHECKMARK1 = "✅"; const string CHECKMARK2 = "\u2705"; Console.WriteLine(CHECKMARK1); Console.WriteLine(CHECKMARK2); Console.WriteLine("✅"); Console.WriteLine("\u2705");
重新发布后,EXE在Windows Terminal中就能正常显示Emoji。
补充说明
Windows Terminal默认采用UTF-8编码,但.NET单文件应用的启动流程中,没有默认启用编码自动检测适配。这是因为单文件发布的应用设计上更偏向独立运行,不会依赖SDK环境的默认配置,需要开发者显式指定编码以适配终端环境。
内容的提问来源于stack exchange,提问作者howdoicode
相关产品推荐
相关产品推荐

