如何将System.out.format与彩色文本一起使用

问题描述

我想给格式化输出着色。但是彩色文本的格式将被忽略:

String leftAlignFormat = "| %-15s | %-15s |";
System.out.format(leftAlignFormat,"\033[38;5;16;48;5;40mHello\033[0m","World");
| Hello | World           |

你好一词的颜色正确,但是为什么你好一词的格式不正确?

解决方法

Java的API本身不了解ANSI彩色转义代码,因此captureRejections: true API会将这些计数视为字符串中的字符。

但是,当那些字符写入ANSI终端时,转义码不会移动光标,因此格式显示不正确。

根据用例的复杂性,您将需要构建自己的包装器API(如果存在带有多种颜色的字符串),或者可以通过确切地知道为生成颜色而添加了多少个额外的字符来解决该问题,并相应地增加填充宽度。为简单起见,我建议始终始终在颜色代码序列之前并附加重置,因此“额外”填充是固定量。

还请记住,ANSI转义代码不可移植,因此您可能需要支持无颜色代码和模板路径,具体取决于目标执行环境

,

这是因为格式基于字符串长度。以下代码将说明发生的情况:

        String hello = "\033[38;5;16;48;5;40mHello\033[0m";
        System.out.println(hello);
        System.out.println(hello.length());

        String leftAlignFormat = "| %-27s | %-20s |";
        System.out.format(leftAlignFormat,hello,"World");
        System.out.println("");
        leftAlignFormat = "| %-28s | %-20s |";
        System.out.format(leftAlignFormat,"World");

字符串长度将输出27。因此设置28将开始填充字符串。可能看起来很尴尬,但是格式化是基于字符串的-并不是要成为ANSI格式化工具。

,

颜色格式"\033[0m"用于重置颜色。

在您的格式中,您仅在第一个字符串的末尾使用了它;因此,其余文字将重置为默认颜色。

System.out.format(leftAlignFormat,"\033[38;5;16;48;5;40mHello\033[0m","World");

基于这种格式,作品Hello必须用绿色突出显示,而其余部分则没有。

enter image description here

这就是我在IDE中看到它的方式。