【问题标题】:How can you use vt100 escape codes in java on windows如何在 Windows 上的 java 中使用 vt100 转义码
【发布时间】:2018-10-11 19:29:36
【问题描述】:

vt100 转义码是一种强大且流行的方法,用于在 xterm 或 konsole 等虚拟终端上格式化输出(颜色、定位、闪烁、下划线等)。见https://en.wikipedia.org/wiki/ANSI_escape_code

当你在 xterm、konsole 等和System.out.print 这样的代码中运行 java 程序时——例如

// print "Hello, World!" in red
System.out.print("\u001b[31mHello, World!");

java 将它们原封不动地传递给终端,因此这些终端会解释代码并按照您的预期行事。

Java 程序应该是独立于平台的,但是当你从 windows 命令提示符运行这样的程序时,你会看到打印出来的代码,如下所示:

☐[31mHello, World!

在寻找解决此问题的方法后,我找不到简单的解决方案,甚至找不到有关该主题的讨论。大多数解决方案都依赖于在不同的控制台应用程序中运行您的程序,或者在您的程序中包含一个基于 java 的自定义控制台。

那么 - 如何在 Windows 默认命令提示符下轻松使用 vt100 格式的文本?

【问题讨论】:

    标签: java windows cmd vt100


    【解决方案1】:

    我不知道这是否适用于旧版本的 Windows(欢迎提供一些反馈 - 我已经在 Windows 10 上进行了测试),但我已从 https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences 底部获取代码并将其翻译为 Java .

    这使用了对 kernel32.dll 的一些调用,因此我不得不合并 Java Native Access (JNA)。要运行它,您需要从 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!”正如预期的那样,以红色显示。

    【讨论】:

    • VT 模式仅在 Windows 10 中受支持。对于 Windows 7 和 8,SetConsoleMode 调用将失败并显示ERROR_INVALID_PARAMETER (87)。
    • 对其他操作系统有什么建议吗?例如。 Linux 还是 macOS?
    • @ChristophSchreiber 大多数 Linux 和 macOS 终端都支持开箱即用的 vt100 代码。
    • @Algoman 我想在终端应用中运行程序
    • 然后运行它。它应该可以工作。
    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多