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

How to use System.out.format with colorized text

我想为格式化输出着色。但是忽略了彩色文本的格式:

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

单词 Hello 的颜色正确,但为什么单词 Hello 的格式不正确?

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

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

System.out.format(leftAlignFormat, "3[38;5;16;48;5;40mHello3[0m", "World");

基于这种格式,作品《你好》必须用绿色高亮显示,其余部分不能。

这就是我在 IDE 中看到的。

Java 的 API 本身不理解 ANSI 颜色转义码,因此 format(...) API 将它们计为字符串中的字符。

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

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

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

这是因为格式化是基于字符串长度的。以下代码将解释会发生什么:

        String hello = "3[38;5;16;48;5;40mHello3[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, hello,  "World");

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