如何在 windows 上的 java 中使用 vt100 转义码
How can you use vt100 escape codes in java on windows
vt100 转义码是一种功能强大且流行的方法,用于在 xterm 或 konsole 等虚拟终端上格式化输出(颜色、定位、闪烁、下划线等)。参见 https://en.wikipedia.org/wiki/ANSI_escape_code
当你在 xterm、konsole 等中 运行 一个 java 程序和 System.out.print
这样的代码时 - 例如
// print "Hello, World!" in red
System.out.print("\u001b[31mHello, World!");
java 将它们原封不动地传递到终端,因此这些终端随后会解释代码并按照您的预期运行。
Java 程序应该是独立于平台的,但是当你从 windows 命令提示符 运行 这样的程序时,你会看到打印出来的代码,像这样:
☐[31mHello, World!
在寻找解决此问题的方法后,我找不到简单的解决方案,甚至找不到有关该主题的讨论。大多数解决方案取决于 运行 在不同的控制台应用程序中安装您的程序,或者将基于 java 的自定义控制台包含到您的程序中。
那么 - 如何在 Windows 默认命令提示符中轻松使用 vt100 格式的文本?
我不知道这是否适用于 windows 的旧版本(欢迎提供一些反馈 - 我已经在 windows 10 上测试过),但我已经从https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences 的底部并将其翻译为 Java。
这使用了对 kernel32.dll 的一些调用,所以我不得不合并 Java Native Access (JNA)。要 运行 这个,你需要从下载 jna-*version*.jar
和 jna-platform-*version*.jar
https://github.com/java-native-access/jna#download 并将它们包含在您的项目中。
然后,添加这些导入:
import com.sun.jna.*;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.platform.win32.WinNT.HANDLE;
并且在您的程序开始时,您可以通过 运行 执行以下代码来启用 vt100:
if(System.getProperty("os.name").startsWith("Windows"))
{
// Set output mode to handle virtual terminal sequences
Function GetStdHandleFunc = Function.getFunction("kernel32", "GetStdHandle");
DWORD STD_OUTPUT_HANDLE = new DWORD(-11);
HANDLE hOut = (HANDLE)GetStdHandleFunc.invoke(HANDLE.class, new Object[]{STD_OUTPUT_HANDLE});
DWORDByReference p_dwMode = new DWORDByReference(new DWORD(0));
Function GetConsoleModeFunc = Function.getFunction("kernel32", "GetConsoleMode");
GetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, p_dwMode});
int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4;
DWORD dwMode = p_dwMode.getValue();
dwMode.setValue(dwMode.intValue() | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
Function SetConsoleModeFunc = Function.getFunction("kernel32", "SetConsoleMode");
SetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, dwMode});
}
从此以后
System.out.print("\u001b[31mHello, World!");
将按预期以红色打印 "Hello, World!"。
vt100 转义码是一种功能强大且流行的方法,用于在 xterm 或 konsole 等虚拟终端上格式化输出(颜色、定位、闪烁、下划线等)。参见 https://en.wikipedia.org/wiki/ANSI_escape_code
当你在 xterm、konsole 等中 运行 一个 java 程序和 System.out.print
这样的代码时 - 例如
// print "Hello, World!" in red
System.out.print("\u001b[31mHello, World!");
java 将它们原封不动地传递到终端,因此这些终端随后会解释代码并按照您的预期运行。
Java 程序应该是独立于平台的,但是当你从 windows 命令提示符 运行 这样的程序时,你会看到打印出来的代码,像这样:
☐[31mHello, World!
在寻找解决此问题的方法后,我找不到简单的解决方案,甚至找不到有关该主题的讨论。大多数解决方案取决于 运行 在不同的控制台应用程序中安装您的程序,或者将基于 java 的自定义控制台包含到您的程序中。
那么 - 如何在 Windows 默认命令提示符中轻松使用 vt100 格式的文本?
我不知道这是否适用于 windows 的旧版本(欢迎提供一些反馈 - 我已经在 windows 10 上测试过),但我已经从https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences 的底部并将其翻译为 Java。
这使用了对 kernel32.dll 的一些调用,所以我不得不合并 Java Native Access (JNA)。要 运行 这个,你需要从下载 jna-*version*.jar
和 jna-platform-*version*.jar
https://github.com/java-native-access/jna#download 并将它们包含在您的项目中。
然后,添加这些导入:
import com.sun.jna.*;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.platform.win32.WinNT.HANDLE;
并且在您的程序开始时,您可以通过 运行 执行以下代码来启用 vt100:
if(System.getProperty("os.name").startsWith("Windows"))
{
// Set output mode to handle virtual terminal sequences
Function GetStdHandleFunc = Function.getFunction("kernel32", "GetStdHandle");
DWORD STD_OUTPUT_HANDLE = new DWORD(-11);
HANDLE hOut = (HANDLE)GetStdHandleFunc.invoke(HANDLE.class, new Object[]{STD_OUTPUT_HANDLE});
DWORDByReference p_dwMode = new DWORDByReference(new DWORD(0));
Function GetConsoleModeFunc = Function.getFunction("kernel32", "GetConsoleMode");
GetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, p_dwMode});
int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4;
DWORD dwMode = p_dwMode.getValue();
dwMode.setValue(dwMode.intValue() | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
Function SetConsoleModeFunc = Function.getFunction("kernel32", "SetConsoleMode");
SetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, dwMode});
}
从此以后
System.out.print("\u001b[31mHello, World!");
将按预期以红色打印 "Hello, World!"。