【问题标题】:How to use System.out.format with colorized text如何使用带有彩色文本的 System.out.format
【发布时间】:2021-02-10 12:48:35
【问题描述】:

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

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

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

【问题讨论】:

  • 感谢您的回答。不,该帖子仅说明了如何打印彩色文本。
  • 确认:您是在问如何使.format(...) 在填充到某个所需宽度(在本例中为 15 个字符宽)时不计算 ANSI 颜色转义码?
  • @DilumRanatunga:是的,完全正确。我已经明确了我的问题。

标签: java ansi-colors


【解决方案1】:

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

        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, hello,  "World");

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

【讨论】:

    【解决方案2】:

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

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

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

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

    这是我在 IDE 中看到的。

    【讨论】:

    • 着色效果符合我的预期。但我的问题是为什么忽略了彩色文本的格式。
    • 我已经添加了一个我在 IDE 中看到它的屏幕截图,所以你是指为什么使用的空间与另一个词(世界)相似?
    • 我想你已经从@Dilum Ranatunga 那里得到了答案
    【解决方案3】:

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

    但是当这些字符写入ANSI终端时,转义码不会移动光标,所以格式看起来不正确。

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

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

    【讨论】:

    • 谢谢。你的解释解决了我的问题。对于我的特殊用例,我现在已经实现了关于转义码的动态对齐。
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多