LinuxのCUIプログラムの標準出力の文字の色を変える - 2015.12.26

lsコマンドを実行すると、出力内容のディレクトリ、バイナリファイルなど色が変更される。これを自作のCUIプログラムに取り入れてみる。

 

まず、lsコマンドのソースを確認したが、環境変数やらtputsやら、ソース解析に時間がかかりそう・・・。手っ取り早く、lsコマンド実行結果のtelnetプロトコルパケットをキャプチャしてみた。キャプチャデータから、色を変更するための エスケープシーケンスをハッキングした。

 

【色を変更するためのエスケープシーケンス】

ヘキサ:0x1b 0x5b 0xXX  0xXX  0x3b  0xXX 0xXX 0x6d
文字列:{ESC}   [   X  X   ;      X  X   m  
文字のタイプ(数字)  文字の色(数字)

 

【文字のタイプ】

  • ・0・・・デフォルト
  • ・1・・・強調
  • ・4・・・アンダーライン
  • ・5・・・点滅

 

【文字の色】

  • ・0・・・デフォルト
  • ・30・・・黒  ・40・・・黒背景
  • ・31・・・赤  ・41・・・赤背景
  • ・32・・・緑  ・42・・・緑背景
  • ・33・・・黄  ・43・・・黄背景
  • ・34・・・青  ・44・・・青背景
  • ・35・・・紫  ・45・・・紫背景
  • ・36・・・シアン ・46・・・シアン背景
  • ・37・・・灰色 ・47・・・灰色背景

 

【例】

    • ・赤文字を出力する場合
      • →{ESC}[00;31m
    • ・文字変更を止める場合
      • →{ESC}[00m

     

    【実践(Javaの場合)】

    public class CollorSysout {
     
            public static void main(String[] args){
     
    		System.out.print("標準出力文字を");
     
    		// {ESC}[00;31m
                    writeSysout((byte)0x1b,(byte)0x5b,
    			(byte)0x30,(byte)0x30,(byte)0x3b,
    			(byte)0x33,(byte)0x31,(byte)0x6d);
    		
    		System.out.print("赤く");
    		System.out.print("、");
    		System.out.print("赤く");
     
    		// {ESC}[00m
                    writeSysout((byte)0x1b,(byte)0x5b,
    			(byte)0x30,(byte)0x30,(byte)0x6d);
    		
    		System.out.println("してみました。");
    	}
     
    	private static void writeSysout(byte... buf){
    		try {
    			System.out.write(buf);
    		} catch(java.io.IOException e) {
    			// 標準出力なんで例外は想定しないことにする。
    		}
    	}
    }
    

1 件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です