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 控制臺輸出: