如何让win32控制台识别ANSI/VT100转义序列?

Wit*_*iko 58 windows terminal ncurses console-application ansi-escape

我正在构建一个轻量级的ncurses库.到目前为止,它与VT100兼容终端的效果非常好,但是win32控制台无法将\033代码识别为转义序列的开头:

# include <stdio.h>
# include "term.h"

int main(void) {
  puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

截图

为了加载ANSI.SYS驱动程序并识别ANSI/VT100转义序列,需要在C代码级别上做什么?

Fra*_*ini 60

[更新]有关最新的Windows 10,请阅读@ brainslugs83的有用贡献,如下面对此答案的评论.

对于之前的版本Windows 10 Anniversary Update:

ANSI.SYS有一个限制,它只能在Windows 95-Vista下的MS-DOS子系统的上下文中运行.

Microsoft KB101875解释了如何在命令窗口中启用ANSI.SYS,但它不适用于Windows NT.根据文章:我们都喜欢颜色,现代版本的Windows没有这种漂亮的ANSI支持.

相反,Microsoft创建了许多功能,但这远远不是您需要操作ANSI/VT100转义序列.

有关更详细的说明,请参阅Wikipedia文章:

ANSI.SYS也适用于NT衍生系统,用于在NTVDM下执行的16位遗留程序.

Win32控制台根本不支持ANSI转义序列.然而,Ansicon等软件可以作为标准Win32控制台的包装,并添加对ANSI转义序列的支持.

所以我认为 Jason Hood的ANSICON是你的解决方案.它是用C语言编写的,支持32位和64位版本的Windows,并且可以使用源代码.

我还发现了一些其他类似的问题或帖子,最终已经回答使用ANSICON:

  • 仅供参考,在最新的Windows 10中,您可以通过以下方法在conhost中启用ANSI - 在`HKCU\Console`中创建一个名为`VirtualTerminalLevel`的`DWORD`并将其设置为`0x1`; 然后重启cmd.exe. - 您可以使用以下powershell来测试它吗?"[1; 31mele?[32mct?[33mroni?[35mX?[36mtar?[m".Replace('?',[char] 27);`. (13认同)
  • 我曾经做过一个黑客,使 ANSI 在没有任何第三方工具的情况下在 Windows XP 中工作 https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/YZnoq80Mcds (2认同)
  • 时间如何变化;)在Windows 10周年更新及以后的版本中,Windows控制台进行了更新,对ANSI / VT序列提供了非常扎实的支持,而在Creators Update中,也更新为也支持24位RGB颜色:https://blogs.msdn .microsoft.com / commandline / 2016/09/22 / 24-bit-color-in-the-windows-console (2认同)

rol*_*lve 37

从Windows 10 TH2(v1511),启动conhost.execmd.exe支持ANSI和VT100转义序列开箱即用(虽然他们必须被启用).

有关详细信息,请在超级用户处查看我的回答.

  • 105xx版本是默认启用VT100序列的唯一版本.在之前和之后的版本中,默认情况下它被禁用,因为它被错误地启用了.请参阅此处获取解释https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/15617610--re-enable-enable-virtual-terminal-处理逐 (4认同)
  • 仅供参考,在最新的Windows 10中,您可以通过以下方法在conhost中启用ANSI - 在`HKCU\Console`中创建一个名为`VirtualTerminalLevel`的`DWORD`并将其设置为`0x1`; 然后重启cmd.exe. - 您可以使用以下powershell来测试它吗?"[1; 31mele?[32mct?[33mroni?[35mX?[36mtar?[m".Replace('?',[char] 27);`. (2认同)

Sta*_*ant 13

从Windows 10开始,您可以使用ENABLE_VIRTUAL_TERMINAL_PROCESSING以启用ANSI转义序列:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx


小智 12

对于Python 2.7,以下脚本适用于Windows 10(v1607)

import os

print '\033[35m'+'color-test'+'\033[39m'+" test end"
os.system('') #enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607
print '\033[35m'+'color-test'+'\033[39m'+" test end"
Run Code Online (Sandbox Code Playgroud)

结果应该是:

[35mcolor-test[39m test end

color-test test end
Run Code Online (Sandbox Code Playgroud)

  • `os.system('')` 的工作显然是由于 cmd.exe 中的错误(cmd.exe 启用 VT 模式,但在退出时不会禁用它)。有关更多信息以及启用 VT 模式的更好代码,请参阅有关 [python.org 上的问题 30075] 的讨论(https://bugs.python.org/issue30075) (5认同)
  • 有人有消息源或知道对控制台进行的“ os.system('')`更改吗? (3认同)
  • 认真地...为什么这样做?任何人? (2认同)

Dan*_*eón 12

基于@BrainSlugs83,您可以使用以下命令行通过注册在当前的 Windows 10 版本上激活:

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1
Run Code Online (Sandbox Code Playgroud)

  • @Youssef13根据https://superuser.com/a/1300251/702169,第一个支持版本是build 16257。 (4认同)
  • 所有 Windows 10 版本都支持此功能吗?或者可以从特定的更新中获得? (2认同)

Joa*_*kim 8

如果ANSICON不可接受,因为它要求您在系统上安装一些东西,这是一个更轻量级的解决方案,它将ANSI代码解析并转换为相关的Win32 API控制台函数,例如SetConsoleTextAttribute.

https://github.com/mattn/ansicolor-w32.c


小智 7

在最新的win10中,可以通过SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING). 请参阅https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example


rho*_*rho 5

有关您需要的cmd着色Windows.h和使用SetConsoleTextAttribute()更多详细信息,请访问http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29.aspx

  • 这是一个非常笨拙的解决方案,更不用说这只允许文本着色的事实 - 而不是ANSI.SYS代码的其余部分.http://users.cybercity.dk/~bse26236/batutil/help/ANSI~S_S.HTM (2认同)

小智 5

也许ANSICON可以帮助你

只需下载并解压文件,具体取决于您的 Windows 操作系统:32 位或 64 位

安装它:ansicon -i