Java输出竖排文字

时间:2021-10-29 21:57:36

输出竖排文字,可以作为签名档:

╔ ═╦ ═╦ ═╦ ═╗
║不║皇║一║天║
║胜║图║入║下║
║人║霸║江║风║
║生║业║湖║云║
║一║谈║岁║出║
║场║笑║月║我║
║醉║中║催║辈║
╚ ═╩ ═╩ ═╩ ═╝


╔ ═╦ ═╦ ═╦ ═╦ ═╦ ═╗
║口║升║,║康║一║祝║
║常║职║学║,║年║大║
║开║加║有║万║里║家║
║。║薪║所║事║身║在║
║ ║,║成║如║体║新║
║ ║笑║,║意║健║的║
╚ ═╩ ═╩ ═╩ ═╩ ═╩ ═╝


/**
 * 将传入的字符组装成竖排签名
 */
public class AssembleWord {
    private static final char[][] style = {"┏┳┓┣╋┫┗┻┛━┃┃".toCharArray(),
                                              "╒╤╕╞╪╡╘╧╛═││".toCharArray(),
                                              "╔╦╗╠╬╣╚╩╝═║║".toCharArray(),
                                              "╔╤╗╠╬╣╚╧╝═║│".toCharArray()
                                              }; //最后一个为内部竖线,倒数第二个外部竖线
    private static final char[] skeleton = style[2]; //样式
    
    public static void main(String[] args) {
        String str = "天下风云出我辈一入江湖岁月催皇图霸业谈笑中不胜人生一场醉";
        String st = "祝大家在新的一年里身体健康,万事如意,学有所成,升职加薪,笑口常开。";
        System.out.println(assemble(str, 7));
        System.out.println(assemble(st, 6));
    }
    
    /**
     * 根据字数转化成竖排签名
     * @param text 待转化的句子
     * @param columnWord 每列句子的字数
     * @return
     */
    public static String assemble(String text, int columnWord){
        int textLen = text.length(); //原文本的长度
        int column = textLen%columnWord == 0 ? textLen/columnWord : (textLen/columnWord + 1);
        column = 2*column + 1; //总的列数,画示意图即知
        int row = columnWord + 2; //总行数
        char[][] arr = new char[row][column];
        //填充边框
        for(int i = 0; i < row; i++){
            for(int j = 0; j < column; j++){
                if(i == 0 && j == 0){ //左上角
                    arr[i][j] = skeleton[0];
                }else if (i == 0 && j == column-1){ //右上角
                    arr[i][j] = skeleton[2];
                }else if (i == row-1 && j == 0){ //左下角
                    arr[i][j] = skeleton[6];
                }else if (i == row-1 && j == column-1){ //右下角
                    arr[i][j] = skeleton[8];
                }else if (j == 0 || j == column-1){ //左右两侧
                    arr[i][j] = skeleton[10];
                }else if ((i == 0 || i == row-1) && j%2 == 1){ //有文字的列对应的顶部底部
                    arr[i][j] = skeleton[9];
                }else if ((i == 0 || i == row-1) && j%2 == 0){ //无文字的列对应的顶部
                    arr[i][j] = i == 0 ? skeleton[1] : skeleton[7];
                }else if (j%2 == 0){ //无文字的列内部
                    arr[i][j] = skeleton[11];
                }
            }
        }
        //填充文本
        char c ;//用于填充的字符
        int k = 0; //用于遍历字符串
        for(int j = column-2; j > 0; j -= 2){
            for(int i = 1; i <= row-2; i++){
                if (k < text.length()){
                    c = text.charAt(k++);
                }else{
                    c = ' ';//无文字则填充全角空格
                }
                arr[i][j] = halfToFull(c);
            }
        }
        //组装成字符串
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < row; i++){
            for(int j = 0; j < column; j++){
                if(arr[i][j] == skeleton[9]) sb.append(" "); //如果要在DOS下运行,必须把这一行注释掉。
                sb.append(arr[i][j]);
            }
            sb.append("\n");
        }
        return sb.toString();
    }
    
    /**
     * 半角字符转化成全角
     * 仅转化ASCII码表中33~126号字符
     * @param c 待转化字符
     * @return
     */
    private static char halfToFull(char c){
        if(c >= 33 && c <= 126){ //经测试可以用此方法把ASCII码表中的这几个字符转化为全角
            return (char)(c + 'a' - 'a');
        }
        return c;
    }
    
    
//    附33~126的ASCII码表
//    33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 
//    43 + 44 , 45 - 46 . 47 / 48 0 49 1 50 2 51 3 52 4 
//    53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 
//    63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 
//    73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 
//    83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 
//    93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 
//    103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 
//    113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 
//    123 { 124 | 125 } 126 ~   

}