Java中ANSI颜色代码在VS Code终端生效但CMD无效的问题
Java控制台彩色文本在Windows CMD中不生效的解决办法
你的Java代码通过ANSI转义序列设置文本颜色,在VS Code终端能正常显示彩色效果,但在Windows原生CMD中运行时,转义字符会直接以←[31m这类形式输出,无法渲染成对应颜色。
问题原因
Windows CMD默认不支持解析ANSI转义序列,需要手动开启虚拟终端支持,或者通过代码层面做跨平台适配。
解决方案
1. 直接开启CMD的ANSI支持
注册表永久开启
打开注册表编辑器(运行regedit),定位到HKEY_CURRENT_USER\Console,右键新建DWORD(32位)值,命名为VirtualTerminalLevel,设置值为1,重启CMD后生效。命令临时开启
在CMD中执行以下命令,然后重启CMD:reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1
2. Java代码层面适配Windows
通过JNA调用Windows API,在代码中动态启用虚拟终端处理,无需手动修改系统设置:
import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.platform.win32.WinNT; public class ConsoleColor { private static final int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004; public interface Kernel32 extends Library { Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class); WinNT.HANDLE GetStdHandle(int nStdHandle); boolean GetConsoleMode(WinNT.HANDLE hConsoleHandle, int[] lpMode); boolean SetConsoleMode(WinNT.HANDLE hConsoleHandle, int dwMode); } public static void enableAnsiSupport() { // 获取标准输出句柄 WinNT.HANDLE handle = Kernel32.INSTANCE.GetStdHandle(-11); int[] mode = new int[1]; if (Kernel32.INSTANCE.GetConsoleMode(handle, mode)) { // 启用虚拟终端处理 mode[0] |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; Kernel32.INSTANCE.SetConsoleMode(handle, mode[0]); } } public static void main(String[] args) { enableAnsiSupport(); System.out.println("\u001B[33mThis text is yellow\u001B[0m"); } }
使用这段代码需要添加JNA依赖,Maven项目可在pom.xml中加入:
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.13.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.13.0</version> </dependency>
3. 使用第三方跨平台库(推荐)
用Jansi库自动处理不同平台的控制台颜色支持,无需关心系统差异:
Maven依赖:
<dependency> <groupId>org.fusesource.jansi</groupId> <artifactId>jansi</artifactId> <version>2.4.0</version> </dependency>
示例代码:
import org.fusesource.jansi.Ansi; import static org.fusesource.jansi.Ansi.ansi; public class JansiColorDemo { public static void main(String[] args) { System.out.println(ansi().fg(Ansi.Color.YELLOW).a("This text is yellow").reset()); } }
运行后,无论是VS Code终端还是Windows CMD,都能正常显示彩色文本。
内容的提问来源于stack exchange,提问作者Annas
相关产品推荐
相关产品推荐

