【问题标题】:Check if console supports ANSI escape codes in Java检查控制台是否支持 Java 中的 ANSI 转义码
【发布时间】:2016-12-09 09:24:34
【问题描述】:

我正在用 Java 构建一个程序,该程序使用 ANSI 转义码使用不同颜色的菜单。类似的东西

System.out.println("\u001B[36m"+"Menu option"+"\u001B[0m");

问题是我想检查将要执行代码的控制台是否支持使用此代码,因此如果不支持,请打印没有代码的替代版本。

这将类似于:

if(console.supportsANSICode){
   System.out.println("\u001B[36m"+"Menu option"+"\u001B[0m");
}
else{
   System.out.println("Menu option");
}

java中有没有方法可以检查这个?

【问题讨论】:

  • 重点是,检查控制台是否支持 ANSI 转义码并不是最好的方法。实际上,您必须在System.out 编写器上使用PrintWriter,以便您可以在其上设置编码类型

标签: java ansi


【解决方案1】:

一个简单的纯 java 解决方案:

if (System.console() != null && System.getenv().get("TERM") != null) {
    System.out.println("\u001B[36m"+"Menu option"+"\u001B[0m");
} else {
    System.out.println("Menu option");
}

第一个术语是检查是否连接了终端,第二个是查看是否定义了 TERM env var(不在 Windows 上)。这并不完美,但在我的情况下效果很好。

【讨论】:

  • 我测试了它,正如你所说,它在 Windows 上不起作用,但对 Unix 系统很有用。由于已经2年了,我将其标记为答案。
  • @slye 你也可以试试github.com/fusesource/jansi,但需要windows上的原生库
【解决方案2】:

我不知道Java是否有一些特殊的方法来处理这个问题,但是有两种方法可以处理这个问题本身。通常使用的方法(至少在 unix 世界中)是从TERM 环境变量中获取使用的终端,并从terminfo/termcap 数据库中查找它的功能(通常使用cursesslang )。另一种更粗略的方法是发送设备状态报告代码("\u001B[6n")并检查终端是否响应。这当然有点小技巧,因为支持 DSR 代码的终端可能不支持颜色。

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多