You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:15:19