美文网首页
Java控制控制台输出颜色以及简单示例

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

作者: SpaceCat | 来源:发表于2022-08-22 23:28 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Java控制控制台输出颜色以及简单示例

          本文链接:https://www.haomeiwen.com/subject/qhywgrtx.html