Files
MAF1/MAF1.Core/Utils/WindowsConsole.cs
T
admin777 950d09ddb0 docs: 为 CLI、网页编排器和插件协议补充学习向注释
在核心类型、图执行器、stdio 插件和前端入口写清职责与对照路径,不改运行行为。
2026-08-28 11:51:48 +08:00

59 lines
1.8 KiB
C#

using System.Runtime.InteropServices;
using System.Text;
namespace MAF1.Utils;
/// <summary>
/// Windows 控制台默认代码页容易把中文打成乱码。启动时切到 UTF-8,并打开 VT 序列(彩色输出用)。
/// </summary>
public static class WindowsConsole
{
private const uint Utf8CodePage = 65001;
private const int StdOutputHandle = -11;
private const uint EnableVirtualTerminalProcessing = 0x0004;
public static void EnableUtf8()
{
if (!OperatingSystem.IsWindows())
{
Console.OutputEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
Console.InputEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
return;
}
SetConsoleOutputCP(Utf8CodePage);
SetConsoleCP(Utf8CodePage);
UTF8Encoding utf8 = new(encoderShouldEmitUTF8Identifier: false);
Console.OutputEncoding = utf8;
Console.InputEncoding = utf8;
nint stdout = GetStdHandle(StdOutputHandle);
if (stdout != nint.Zero && GetConsoleMode(stdout, out uint mode))
{
SetConsoleMode(stdout, mode | EnableVirtualTerminalProcessing);
}
StreamWriter writer = new(Console.OpenStandardOutput(), utf8)
{
AutoFlush = true,
};
Console.SetOut(writer);
}
[DllImport("kernel32.dll")]
private static extern bool SetConsoleOutputCP(uint wCodePageID);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCP(uint wCodePageID);
[DllImport("kernel32.dll")]
private static extern nint GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
private static extern bool GetConsoleMode(nint hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleMode(nint hConsoleHandle, uint dwMode);
}