如何通过C语言判断stdout是否支持ANSI escape code
C语言判断终端是否支持ANSI转义码的实现方案
jq的底层判断逻辑非常简洁,核心分为两步判断,覆盖绝大多数使用场景:
- 第一步:判断标准输出是否关联到交互式终端
调用unistd.h头文件中提供的isatty()函数,传入参数STDOUT_FILENO。如果返回值为0,说明输出被重定向到文件、管道等非终端设备,无需启用ANSI颜色输出。 - 第二步:校验
TERM环境变量
读取系统TERM环境变量,如果变量为空,或者值为dumb,说明终端不支持ANSI转义序列,其余常见终端类型(xterm、vt100、linux、screen、tmux等)均默认支持ANSI转义。
如果需要更精准的终端能力校验,可以引入termcap/terminfo库查询对应终端的属性,不过上述两步逻辑已经可以满足99%的使用场景,也是绝大多数命令行工具采用的通用判断逻辑。
参考实现代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int is_ansi_supported(void) { // 校验是否输出到交互式终端 if (!isatty(STDOUT_FILENO)) { return 0; } // 校验TERM环境变量 char *term_env = getenv("TERM"); if (term_env == NULL || strcmp(term_env, "dumb") == 0) { return 0; } return 1; } int main(void) { if (is_ansi_supported()) { printf("\033[32m当前终端支持ANSI转义码\033[0m\n"); } else { printf("当前终端不支持ANSI转义码\n"); } return 0; }
Windows平台适配补充
Windows 10 1511及以上版本的控制台支持ANSI转义码,但需要手动开启对应开关,适配代码如下:
#ifdef _WIN32 #include <windows.h> int win_enable_ansi_support(void) { HANDLE std_output = GetStdHandle(STD_OUTPUT_HANDLE); if (std_output == INVALID_HANDLE_VALUE) { return 0; } DWORD console_mode = 0; if (!GetConsoleMode(std_output, &console_mode)) { return 0; } // 开启ANSI转义支持开关 console_mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; if (!SetConsoleMode(std_output, console_mode)) { return 0; } return 1; } #endif
内容的提问来源于stack exchange,提问作者aszswaz
相关产品推荐
相关产品推荐

