Java System.out.println中文本的可靠着色

deyfvvtc  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(172)

我想在一个Java控制台应用程序中给某些消息上色。我发现了各种各样的答案,例如,在所需的字符串之前包含\u001B[31m,但这只是将·[37m打印到我的控制台中。我怀疑这可能与我的计算机被设置为日语系统区域设置有关。但是我还没有找到任何关于如何解决这个问题的建议,这样它就可以在不同的Windows系统区域设置下工作。我希望得到任何帮助,了解这是否确实是原因,以及我如何解决它。作为参考,它 * 确实 * 在IDE控制台中工作,如IntelliJ或VS代码;在命令提示符中使用时,它尤其不起作用。

5f0d552i

5f0d552i1#

运行以下代码时,我可以在Windows 10上重现您的问题:

System.out.println("\u001B[31m Line 1\u001B[0m");
    System.out.println("\u001B[32m Line 2\u001B[0m");
    System.out.println("\u001B[33m Line 3\u001B[0m");
    System.out.println("\u001B[34m Line 4\u001B[0m");
    System.out.println("\u001B[35m Line 5\u001B[0m");

传递给println()的每个字符串以不同的字体颜色输出文本,并包含两个ANSI转义序列:

  • 第一个设置字体颜色。例如,"\u001b[31m"将字体颜色设置为深红色。
  • 第二个(即"\u001B[0m")将终端重置回默认颜色。

有关详细信息,请参见How-to: Use ANSI colors in the terminal
当输出被发送到Intellij IDEA内的控制台时,字体颜色的更改会正确呈现,如以下屏幕截图所示:

但是,正如您所指出的,在命令提示符窗口中运行相同的代码时,ANSI转义序列无法识别。

我不认为您的问题与区域设置有关。相反,您遇到了Windows上的命令提示符窗口的限制;它不能正确处理那些ANSI转义序列。
这个问题应该已经在Windows 10的最新版本中得到了修复,尽管显然需要对Windows注册表进行相关的修改(我没有实现)。
然而,有一种更简单、更安全的方法对我很有效:

  • 下载并安装Windows终端(wt.exe)。详细信息请参见Install and get started setting up Windows Terminal
  • 安装并运行Windows终端后,您可以使用它打开命令提示符窗口,该窗口将识别这些ANSI转义序列。当从Windows终端的命令提示符窗口运行在独立命令提示符窗口(如上所示)失败的相同代码时,输出如下:

注:

  • 如果你想在任何Windows机器上运行你的代码,那么显然这不是一个解决方案,因为它依赖于Windows终端的安装。然而,这似乎仍然优于搞乱注册表,这是潜在的危险,可能会有不必要的副作用。
  • 安装Windows终端后,我不得不做几个简单的更改:启用 * 触摸键盘和手写面板服务 *,然后重新启动。
  • 我没有尝试过,但是你并不局限于改变字体颜色。其他特性(例如背景色、 Flink 、下划线、粗体等)也应该使用适当的ANSI转义序列。更多信息请参见Console Virtual Terminal Sequences
eblbsuwk

eblbsuwk2#

Can you try with this statement->
    System.out.println("\u001B[31m" + "This text is red");

相关问题