Как я могу получить escape-коды ANSI для вывода цветных выходных данных терминала в консоли Windows CMD с помощью консольного приложения C++?
Это то, что я пробовал до сих пор:
#include <windows.h>
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#endif
int main()
{
HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
SetConsoleMode(h, ENABLE_VIRTUAL_TERMINAL_PROCESSING);
printf("%c[%dm foo!\n", 0x1B, 32); // 1
printf("\e[31m foo \e[0m bar\n"); // 2
printf("^\u0001b[31m foo \u0001b[0m bar\n"); // 3
printf("^[[31m foo"); // 4
printf("\033[1;31m foo \e[0m bar\n"); // 5
};
- Следуя этой теме в C++ должно работать
printf("%c[%dmHELLO!\n", 0x1B, 32);
, но это не так - у меня выводится[32MHELLO!
. printf("\e[31m foo \e[0m bar");
должен выводить красныйfoo
иbar
по умолчанию, но печатает только?[31m foo ?[0m bar
.- Замена
\e
на\u001b
ничего не дает. - Копирование функционирующей строки из окна cmd
^[[31m foo
и использование ее в printf - Переход с другим escape-символом,
printf("\033[1;32m foo \e[0m bar");
Я также протестировал вывод, используя как printf("foo")
, так и std::out << "foo";
для всех перечисленных выше примеров. Ничего не работает. Я мог бы понять, если бы не поддерживались полные цвета XTERM, но ANSI, на мой взгляд, является основным ожиданием. Насколько мне известно, коды ANSI поддерживаются в окне командной строки по умолчанию. Вот почему я в замешательстве по этому поводу.
ctrl+[, за которым следует 31m
в окне Windows CMD, позволяет использовать окраску ANSI в окне — так почему я не могу сделать это из C++?
Это не особенно насущная проблема, но она все равно беспокоит меня. Я уверен, что это должно быть возможно, но я просто не могу заставить его работать.