控制台打印带格式内容
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 formatDEFAULT(0),// other formatBOLD(1),ITALIC(3),UNDERLINE(4),REVERSE_DISPLAY(7),LINE_THROUGH(9),// font formatFONT_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 formatBACKGROUND_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 控制台输出:
 
