这里介绍如何控制java控制台输出内容的颜色,以及一个有意义的使用场景。
测试环境:MacOS Monterey、IDEA
1、java控制台输出颜色控制
在java语言中,可以通过\033
特殊转义字符实现输出格式控制,如下是一个例子。
com/lfqy/trying/consoleoutput/ConsoleOutputControl.java
:
package com.lfqy.trying.consoleoutput;
/**
* Created by chengxia on 2022/8/19. */
public class ConsoleOutputControl {
/**
* 通过\033特殊转义字符实现输出格式控制 * @param content, 待格式化的内容
* @param fontColor, 字体颜色:30黑 31红 32绿 33黄 34蓝 35紫 36深绿 37白
* @param fontType, 字体格式:0重置 1加粗 2减弱 3斜体 4下划线 5慢速闪烁 6快速闪烁
* @param backgroundColor, 字背景颜色:40黑 41红 42绿 43黄 44蓝 45紫 46深绿 47白
* */ public static String getFormatOutputString(String content, int fontColor, int fontType, int backgroundColor){
return String.format("\033[%d;%d;%dm%s\033[0m", fontColor, fontType, backgroundColor, content);
}
/**
* 通过\033特殊转义字符实现输出格式控制,获得带颜色的字体输出 * @param content, 待格式化的内容
* @param fontColor, 字体颜色:30黑 31红 32绿 33黄 34蓝 35紫 36深绿 37白
* */ public static String getColoredOutputString(String content, int fontColor){
return String.format("\033[%dm%s\033[0m", fontColor, content);
}
/**
* 通过\033特殊转义字符实现输出格式控制,获得带背景颜色的字体输出 * @param content, 待格式化的内容
* @param backgroundColor, 字背景颜色:40黑 41红 42绿 43黄 44蓝 45紫 46深绿 47白
* */ public static String getBackgroundColoredOutputString(String content, int backgroundColor){
return String.format("\033[%dm%s\033[0m", backgroundColor, content);
}
/**
* 能接受一个顺序标识,按顺序产生带颜色的输出字符串 * */ public static String orderedColorString(String content, int i){
int tmpColor = 31 + (i % 7);
return String.format("\033[%dm%s\033[0m", tmpColor, content);
}
public static void main(String []args){
System.out.println(getFormatOutputString("字体颜色为红色,背景色为黄色,带下划线", 31, 4, 43));
//按顺序输出各个颜色代码的字符串
for(int i = 0; i < 7; i++){
System.out.println(getColoredOutputString(String.format("color code: %d", 31 + i), 31 + i));
}
//按顺序输出各个背景颜色代码的字符串
for(int i = 0; i < 7; i++){
System.out.println(getBackgroundColoredOutputString(String.format("background color code: %d", 41 + i), 41 + i));
}
//按顺序输出各个颜色代码的字符串
for(int i = 0; i < 7; i++){
System.out.println(orderedColorString(String.format("font color code: %d", 31 + i), i));
}
}
}
从这个例子可以看出,可以设置多种输出格式,不同格式之间用;
分隔。
运行前面的程序,可以看到如下输出。
2、通过颜色区分不同编码格式输出
这里是一个例子,主要是展示java字符串不同编码格式的输出。
com/lfqy/trying/javaenc/StringEncodingShow.java
:
package com.lfqy.trying.javaenc;
import com.lfqy.trying.consoleoutput.ConsoleOutputControl;
/**
* Created by chengxia on 2022/8/20. * 如果运行控制台乱码,需要添加如下VM options: * -Dconsole.encoding=utf-8 */public class StringEncodingShow {
/**
* 将字符串str用字符c左补齐到长度len * */ private static String lpadString(String str, int len, char c){
StringBuffer sb = new StringBuffer(str);
for(int i = str.length(); i < len; i++){
sb.insert(0, c);
}
return sb.toString();
}
/**
* 将字符串转换为CodeUnit(各个CodeUnit之间带颜色区分) * */ public static String getColoredCodeUnitOfString(String str){
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i++){
int tmpCodeUnit = (int)str.charAt(i);
sb.append(ConsoleOutputControl.orderedColorString(lpadString(Integer.toHexString(tmpCodeUnit), 4, '0').toUpperCase(), i));
}
return sb.toString();
}
/**
* 将字符串转换为CodePoint(各个CodePoint之间带颜色区分) * */ public static String getColoredCodePointOfString(String str){
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i++){
int tmpCodePoint = (int)str.codePointAt(i);
sb.append(ConsoleOutputControl.orderedColorString(lpadString(Integer.toHexString(tmpCodePoint), 4, '0').toUpperCase(), i));
//如果当前这个CodePoint是增补字符集的话,两个char表示一个CodePoint需要额外自增1处理
if(Character.isSupplementaryCodePoint(tmpCodePoint)){
i++;
}
}
return sb.toString();
}
/**
* 将字符串转换为不同编码格式表示(各个字符的编码之间带颜色区分) * */ public static String getColoredHexEncodeOfString(String str, String encoding){
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i++){
int tmpCodePoint = (int)str.codePointAt(i);
String tmpSubStr = str.substring(i, i + 1);
//如果当前这个CodePoint是增补字符集的话,两个char表示一个CodePoint
if(Character.isSupplementaryCodePoint(tmpCodePoint)){
tmpSubStr = tmpSubStr + str.substring(i + 1, i + 2);
i++;
}
try{
StringBuffer tmpSb = new StringBuffer();
byte[] tmpBytes = tmpSubStr.getBytes(encoding);
for(int iTmp = 0; iTmp < tmpBytes.length; iTmp++){
tmpSb.append(String.format("%02X", tmpBytes[iTmp]));
}
sb.append(ConsoleOutputControl.orderedColorString(tmpSb.toString(), i));
}catch (Exception e){
e.printStackTrace();
}
}
return sb.toString();
}
public static void main(String []args){
//实际上就是字符串"我啊覺鵝〇喆鿏𬌗"
String strDiffEncoding = "A\u6211\u554A\u89BA\u9D5D\u3007\u5586\u9FCF\uD870\uDF17";
//将字符串用各种编码格式输出
System.out.println("?" + " encode in GB2312 output: " + getColoredHexEncodeOfString("?", "GB2312"));
System.out.println("?" + " encode in GBK output: " + getColoredHexEncodeOfString("?", "GBK"));
System.out.println("?" + " encode in GB18030 output: " + getColoredHexEncodeOfString("?", "GB18030"));
System.out.println(strDiffEncoding + " code unit output: " + getColoredCodeUnitOfString(strDiffEncoding));
System.out.println(strDiffEncoding + " code point output: " + getColoredCodePointOfString(strDiffEncoding));
System.out.println(strDiffEncoding + " encode in GB2312 output: " + getColoredHexEncodeOfString(strDiffEncoding, "GB2312"));
System.out.println(strDiffEncoding + " encode in BIG5 output: " + getColoredHexEncodeOfString(strDiffEncoding, "BIG5"));
System.out.println(strDiffEncoding + " encode in GBK output: " + getColoredHexEncodeOfString(strDiffEncoding, "GBK"));
//System.out.println(strDiffEncoding + " encode in bestfit936 output:" + getColoredHexEncodeOfString(strDiffEncoding, "bestfit936"));//实际上和GBK基本一样,windows可以正常输出,但是mac上不支持,会报错
System.out.println(strDiffEncoding + " encode in GB18030 output: " + getColoredHexEncodeOfString(strDiffEncoding, "GB18030"));
System.out.println(strDiffEncoding + " encode in UTF-8 output: " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-8"));
System.out.println(strDiffEncoding + " encode in UTF-16 output: " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-16"));
System.out.println(strDiffEncoding + " encode in UTF-16BE output: " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-16BE"));
System.out.println(strDiffEncoding + " encode in UTF-16LE output: " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-16LE"));
}
}
输出如下:
02_CharacterEncodingShow
从这个结果可以看出,当一个字符在编码中不存在,找不到映射时,这个字符就会被映射为问号。
通过这个例子,可以方便地了解到不同常见编码方式之间的异同。
网友评论