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 控制台输出: