gpt4 book ai didi

c# - Cygwin 中的 24 位控制台颜色 ANSI 代码

转载 作者:行者123 更新时间:2023-12-04 04:08:21 26 4
gpt4 key购买 nike

我编写了这个简单的 C#/.NET Core 控制台应用程序代码,它输出一组 7x7x7 的颜色立方体,测试 24 位颜色而不是 256 色模式,以及我使用的自定义 TTF 字体,该字体源自“Ultimate Old School PC 字体包”以包含一些额外的 Unicode 块字符。

如图所示,它在 Windows 10 终端中运行良好,但在 Cygwin 中运行良好,即使根据 Github ( https://gist.github.com/XVilka/8346728 ) 应该支持它。

如果代码中使用 [38m 或 [48m 代码,使用 Cygwin.bat 或来自 Cygwin 的 mintty 可能在某种程度上与 Cygwin 不太兼容,那么任何关于可能出错的想法?

但是,正如您从第三张图片中看到的,它在来自 Mingw64/MSYS2 的 Mintty 中看起来很好,但我更喜欢使用 Cygwin。正如您所看到的,它以某种方式破坏了第三张图片中的三角形字符,即使我在 mintty 中将字符集设置设置为 UTF-8。

using System;
using System.Text;

namespace ConsoleColor
{
public class App
{
//int[] colorMeta1 = { 0, 85, 170, 255 };
int[] colorMeta2 = { 0, 43, 85, 127, 170, 213, 255 };

public App()
{
int length = colorMeta2.Length;
int index = 0;
Encoding defaultEncoder = Console.OutputEncoding;
Console.OutputEncoding = Encoding.UTF8;
for (int r=0;r<length;r++)
{
for(int g=0;g<length;g++)
{
for(int b=0;b<length;b++)
{
int r2 = colorMeta2[r];
int g2 = colorMeta2[g];
int b2 = colorMeta2[b];
int foregroundColor = (r2 == 255 || g2 == 255 || b2 == 255) ? 0 : 255;
Console.Write($"\u001b[38;2;{r2};{g2};{b2}m█");
Console.Write($"\u001b[38;2;{foregroundColor};{foregroundColor};{foregroundColor}m\u001b[48;2;{r2};{g2};{b2}m({r2.ToString().PadLeft(3, ' ')},{g2.ToString().PadLeft(3, ' ')},{b2.ToString().PadLeft(3, ' ')})");
Console.Write($"\u001b[38;2;{r2};{g2};{b2}m█");
Console.Write($"\u001b[38;2;{170};{170};{170}m");
Console.Write($"\u001b[48;2;{0};{0};{0}m");
index++;
}
Console.WriteLine();
}
}
Console.WriteLine($"{index} total colors.");
for (int a = 0x2580; a <= 0x259F; a++)
Console.Write($"{(char)a}");
for (int a = 0x25E2; a <= 0x25E5; a++)
Console.Write($"{(char)a}");
Console.WriteLine();
Console.OutputEncoding = defaultEncoder;
}
}

class Program
{
static void Main(string[] args)
{
App app = new App();
}
}
}

命令提示符:
Command Prompt

Windows 10 中来自 Cygwin 的 Cygwin 命令提示符或 Mintty 3.1.6:
Cygwin and Mintty

Mintty 3.1.6 in Mingw64 from MSYS2 in Windows 10:
Mintty from MSYS

最佳答案

以下博客文章显示了需要做的事情。显然,仍然需要在 Windows 10 上的 .NET Core 控制台应用程序中进行一些 win32 调用,Cygwin/Mintty 才能正常使用它们。

https://www.jerriepelser.com/blog/using-ansi-color-codes-in-net-console-apps/

代码:

private const int STD_OUTPUT_HANDLE = -11;
private const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004;
private const uint DISABLE_NEWLINE_AUTO_RETURN = 0x0008;

[DllImport("kernel32.dll")]
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);

[DllImport("kernel32.dll")]
private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll")]
public static extern uint GetLastError();

...
public void ConsoleInit()
{
var iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (!GetConsoleMode(iStdOut, out uint outConsoleMode))
{
Console.WriteLine("failed to get output console mode");
Console.ReadKey();
return;
}

outConsoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
if (!SetConsoleMode(iStdOut, outConsoleMode))
{
Console.WriteLine($"failed to set output console mode, error code: {GetLastError()}");
Console.ReadKey();
return;
}
}

这一行特别重要:
outConsoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;

关于c# - Cygwin 中的 24 位控制台颜色 ANSI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62165191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com