Java控制控制台输出颜色以及简单示例

2022-08-22  本文已影响0人  SpaceCat

这里介绍如何控制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));  
        }  
    }  
}

从这个例子可以看出,可以设置多种输出格式,不同格式之间用;分隔。
运行前面的程序,可以看到如下输出。

01_OutputColorControl

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

从这个结果可以看出,当一个字符在编码中不存在,找不到映射时,这个字符就会被映射为问号。
通过这个例子,可以方便地了解到不同常见编码方式之间的异同。

上一篇下一篇

猜你喜欢

热点阅读