WPF应用程序如何向Console写入UTF-8编码内容?
WPF双模式应用控制台输出UTF-8编码问题解决
问题场景
我开发了一个支持UI和控制台两种运行模式的WPF应用,会向stdout写入包含非ASCII字符的内容,例如:
Console.WriteLine("ÀÁÂÃÄÅÆ ®¯°±¹²³¼½¾¶·");
将输出重定向到文件后,文件编码为ISO-8859,但我需要输出为UTF-8编码。尝试设置Console.OutputEncoding = System.Text.Encoding.UTF8;时,抛出异常:
System.IO.IOException: "The handle is invalid"
问题原因
当WPF应用以UI模式运行时,系统并未分配有效的控制台句柄,此时直接修改Console.OutputEncoding会触发句柄无效的异常;仅在应用以控制台模式运行时,控制台句柄才有效,设置编码不会报错。
解决方案
方案1:判断控制台有效性后设置编码
通过Windows API检测当前应用是否关联有效控制台,仅在存在控制台时设置输出编码:
using System.Runtime.InteropServices; public static class ConsoleHelper { [DllImport("kernel32.dll")] private static extern IntPtr GetConsoleWindow(); public static bool HasValidConsole() { return GetConsoleWindow() != IntPtr.Zero; } } // 在应用启动时执行 if (ConsoleHelper.HasValidConsole()) { Console.OutputEncoding = System.Text.Encoding.UTF8; }
方案2:直接使用UTF-8流写入标准输出
无论应用是否处于控制台模式,直接创建UTF-8编码的StreamWriter替换默认输出流,确保重定向输出始终为UTF-8编码:
var utf8Output = new StreamWriter(Console.OpenStandardOutput(), System.Text.Encoding.UTF8) { AutoFlush = true // 确保立即写入,避免缓存 }; Console.SetOut(utf8Output); // 后续输出会自动使用UTF-8编码 Console.WriteLine("ÀÁÂÃÄÅÆ ®¯°±¹²³¼½¾¶·");
该方案在UI模式下重定向输出时,也能保证生成的文件为UTF-8编码,同时避免句柄无效的异常。
内容的提问来源于stack exchange,提问作者user829755
相关产品推荐
相关产品推荐

