控制台打印带格式内容

1. 场景

很多软件会在控制台打印带颜色和格式的文字,需要使用转义符实现这个功能。

2. 详细说明

2.1.转义符说明

样式开始:\033[+参数1+;+参数2+;+参数3+m

可以多个参数叠加,若同一类型的参数(如字体颜色)设置了多个,则以最后一个为准。

样式结束:\033[0m

0 是默认样式,也就是表示从此处往后的样式为默认样式

2.2.参数说明

其他格式:

参数值含义
0默认值
1粗体
3斜体
4下划线
7反显
9中划线

字体格式:

参数值含义
30黑色字体
90黑色字体+高亮
31红色字体
91红色字体+高亮
32绿色字体
92绿色字体+高亮
33黄色字体
93黄色字体+高亮
34蓝色字体
94蓝色字体+高亮
35紫色字体
95紫色字体+高亮
36青色字体
96青色字体+高亮
37白色字体
97白色字体+高亮

背景格式:

参数值含义
40黑色背景
100黑色背景+高亮
41红色背景
101红色背景+高亮
42绿色背景
102绿色背景+高亮
43黄色背景
103黄色背景+高亮
44蓝色背景
104蓝色背景+高亮
45紫色背景
105紫色背景+高亮
46青色背景
106青色背景+高亮
47白色背景
107白色背景+高亮

3. 代码实现

格式参数枚举类

public enum TextFormatterEnum {
    // no format
    DEFAULT(0),
    // other format
    BOLD(1),
    ITALIC(3),
    UNDERLINE(4),
    REVERSE_DISPLAY(7),
    LINE_THROUGH(9),
    // font format
    FONT_BLACK(30),
    FONT_BLACK_LIGHT(90),
    FONT_RED(31),
    FONT_RED_LIGHT(91),
    FONT_GREEN(32),
    FONT_GREEN_LIGHT(92),
    FONT_YELLOW(33),
    FONT_YELLOW_LIGHT(93),
    FONT_BLUE(34),
    FONT_BLUE_LIGHT(94),
    FONT_PURPLE(35),
    FONT_PURPLE_LIGHT(95),
    FONT_CYAN(36),
    FONT_CYAN_LIGHT(96),
    FONT_WHITE(37),
    FONT_WHITE_LIGHT(97),
    // background format
    BACKGROUND_BLACK(40),
    BACKGROUND_BLACK_LIGHT(100),
    BACKGROUND_RED(41),
    BACKGROUND_RED_LIGHT(101),
    BACKGROUND_GREEN(42),
    BACKGROUND_GREEN_LIGHT(102),
    BACKGROUND_YELLOW(43),
    BACKGROUND_YELLOW_LIGHT(103),
    BACKGROUND_BLUE(44),
    BACKGROUND_BLUE_LIGHT(104),
    BACKGROUND_PURPLE(45),
    BACKGROUND_PURPLE_LIGHT(105),
    BACKGROUND_CYAN(46),
    BACKGROUND_CYAN_LIGHT(106),
    BACKGROUND_WHITE(47),
    BACKGROUND_WHITE_LIGHT(107);

    int value;

    TextFormatterEnum(int value) {
        this.value = value;
    }
}

内容格式化类

import java.util.Arrays;

public class TextFormatter {
    private static final String EMPTY = "";
    private static final String SEPARATOR = ";";
    private static final String FORMATTER = "\033[%sm%s\033[0m";

    public static String formatText(String text, TextFormatterEnum... formats) {
        if (text == null || text.isEmpty()) {
            return EMPTY;
        }
        if (formats == null || formats.length == 0) {
            return text;
        }
        String[] array = Arrays.stream(formats).map(format -> String.valueOf(format.value)).toArray(String[]::new);
        String formatStr = String.join(SEPARATOR, array);
        return String.format(FORMATTER, formatStr, text);
    }
}

注:在 cmd 或 powershell 窗口,上述代码无法输出带格式内容,可以使用jansi这个库;如果使用 python,在输出到控制台前,先执行cls命令,再输出,即可进行带格式的内容打印。

4. 测试

测试代码:

public class Test {
    public static void main(String[] args) {
        System.out.println(TextFormatter.formatText("红、白字体同时设置,后设置的白色覆盖前面的红色,黑色背景带中划线和下划线粗体斜体",
                TextFormatterEnum.UNDERLINE, TextFormatterEnum.LINE_THROUGH, TextFormatterEnum.ITALIC,
                TextFormatterEnum.BOLD, TextFormatterEnum.FONT_RED_LIGHT, TextFormatterEnum.FONT_WHITE,
                TextFormatterEnum.BACKGROUND_BLACK) + TextFormatter.formatText("蓝色字体紫色背景带中划线和下划线粗体斜体+反显",
                TextFormatterEnum.FONT_YELLOW, TextFormatterEnum.UNDERLINE, TextFormatterEnum.LINE_THROUGH,
                TextFormatterEnum.ITALIC, TextFormatterEnum.BOLD, TextFormatterEnum.BACKGROUND_PURPLE,
                TextFormatterEnum.REVERSE_DISPLAY));
    }
}

IDEA 控制台输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值