Java 出力に色を付けるにはどうすればよいですか?
たとえば、C や他の言語では、ANSI エスケープを使用して\033[0m
これを実行できます。しかし、Java では機能しません。
public static void main(String[] x) {
System.out.println("\033[0m BLABLA \033[0m\n");
}
ベストアンサー1
注記
Windows では色付けできないかもしれませんcmd prompt
が、多くの Unix (または Unix ライクな) 端末では機能するはずです。
また、一部の端末では、ANSI エスケープ シーケンスの一部 (存在する場合) と、特に 24 ビット カラーがサポートされないことに注意してください。
使用法
セクションを参照してください呪い一番下の「最適な解決策」をクリックしてください。個人的な解決策や簡単な解決策(ただしないクロスプラットフォームソリューションとして、ANSI エスケープ シーケンスセクション。
要約
ジャワ:
System.out.println((char)27 + "[31m" + "ERROR MESSAGE IN RED");
パイソン:
print(chr(27) + "[31m" + "ERROR MESSAGE IN RED")
- バッシュまたは翻訳:
printf '\x1b[31mERROR MESSAGE IN RED'
- これは Os X でも機能する可能性があります:
printf '\e[31mERROR MESSAGE IN RED'
- これは Os X でも機能する可能性があります:
- シュ:
printf '
CTRL+ V、CTRL+[[31mERROR MESSAGE IN RED'
- つまり、押すCtrl+V キーその後Ctrl+[ESCエスケープ解釈が利用できない場合に「生の」文字を取得するため
- 正しく実行されると、 が表示されます
^[
。2 つの文字のように見えますが、実際には 1 つのESC文字、つまり です。 - CTRL+ V、CTRL+を押す[こともできますヴィムESCプログラミング言語やスクリプト言語では、文字リテラルを使用するため
- また、Ctrl+を …[に置き換えることもできます。たとえば、 + 、ESCを使用できますが、すでに と を押しているため、前者の方が簡単だと思います。CTRLVESCCTRL[
ANSI エスケープ シーケンス
エスケープシーケンスの背景
これは最善の方法ではありませんが、プログラミング言語やスクリプト言語でこれを行う最も簡単な方法は、エスケープシーケンス. そのリンクから:
エスケープ シーケンスは、コンピューターおよび接続された周辺機器の状態を変更するために使用される一連の文字です。これらは、デバイス制御での使用を反映して、制御シーケンスとも呼ばれます。
ANSIエスケープシーケンスの背景
しかし、ビデオテキスト端末では、それよりもさらに簡単になります。これらの端末では、ANSIエスケープシーケンス. そのリンクから:
ANSI エスケープ シーケンスは、ビデオ テキスト ターミナルのカーソルの位置、色、およびその他のオプションを制御するためのインバンド シグナリングの標準です。ほとんどのバイト シーケンスは Esc と '[' で始まり、テキストに埋め込まれます。ターミナルはこれを探して、文字コードではなくコマンドとして解釈します。
ANSIエスケープシーケンスの使い方
一般的に
- エスケープ シーケンスはエスケープ文字で始まります。ANSI エスケープ シーケンスの場合、シーケンスは常にESC(ASCII:
27
/ 16 進数:0x1B
) で始まります。 - 実行できる操作の一覧については、Wikipedia の ANSI エスケープ シーケンス リスト
プログラミング言語
\e
一部のプログラミング言語(Javaなど)では、またはを文字\x1b
として解釈しませんESC。ただし、ASCII文字は27
は文字ESCなので、単に27
a に型変換しchar
、それを使用してエスケープ シーケンスを開始できます。
一般的なプログラミング言語でこれを行う方法はいくつかあります。
ジャワ
System.out.println((char)27 + "[33mYELLOW");
Python3 について
print(chr(27) + "[34mBLUE");
print("\x1b[35mMAGENTA");
\x1b
Pythonでは正しく解釈されることに注意してください
ノードJS
- 以下はないWebコンソールのJavaScriptによるカラー出力
console.log(String.fromCharCode(27) + "[36mCYAN");
console.log("\x1b[30;47mBLACK_ON_WHITE");
\x1b
ノードでも動作することに注意してください
シェルプロンプトまたはスクリプト
あなたがバッシュまたは翻訳出力に色を付けるのは非常に簡単です (ほとんどの端末で)。Linux、OS X、および一部の Windows 端末では、次の 2 つの操作を行うことで、端末が色をサポートしているかどうかを確認できます。
printf '\e[31mRED'
printf '\x1b[31mRED'
両方に色が表示されたら、それは素晴らしいことです。一方だけに色が表示された場合は、そのシーケンスを使用してください。どちらにも色が表示されない場合は、すべて正しく入力したこと、および bash または zsh を使用していることを再度確認してください。それでも色が表示されない場合は、ターミナルが ANSI エスケープ シーケンスをサポートしていない可能性があります。
\e
私の記憶が正しければ、Linux 端末は と の両方の\x1b
エスケープ シーケンスをサポートする傾向があり、OS X 端末は のみをサポートする傾向にあると思います\e
が、間違っているかもしれません。とはいえ、次の画像のようなものが表示されれば、すべて準備完了です。(シェルを使用していることに注意してください。翻訳、そしてそれは私のプロンプト文字列に色を付けています。また、私はウルクスLinux のターミナルとして。
"これはどのように作動しますか?"と疑問に思うかもしれません。基本的には、printf
文字のシーケンス(シングルクォート)。が またはにprintf
遭遇すると、これらの文字を 文字 (ASCII: 27) に変換します。これがまさに私たちが求めていたものです。次に、は を送信します。 の後に有効な ANSI エスケープ シーケンスが続くため、色付きの出力が得られるはずです (端末でサポートされている限り)。\e
\x1b
ESCprintf
ESC31m
ESC
echo -e '\e[32mGREEN'
(例えば)を使用して出力を色付けすること-e
もできます。echo
「バックスラッシュエスケープの解釈を有効にする」echo
エスケープ シーケンスを適切に解釈したい場合は、 を使用する必要があります。
ANSIエスケープシーケンスの詳細
ANSI エスケープ シーケンスはカラー出力以外にもさまざまな機能がありますが、まずはカラーがどのように機能するかを見てみましょう。次に、カーソルの操作方法を見ていきます。最後に、8 ビット カラーと 24 ビット カラー (サポートは限定的ですが) の使用方法を見ていきます。
の上ウィキペディアESC[、彼らはと呼ぶのでCSI
、私も同じようにします。
色
ANSI エスケープを使用して出力に色を付けるには、次のようにします。
CSI
n
m
CSI
: エスケープ文字—^[[
またはESC[n
: 数値(次のいずれか)30
-37
,39
: 前景40
-47
、49
: 背景
m
: リテラルASCIIm
—エスケープシーケンスを終了します
bash または zsh を使用して、可能なすべての色の組み合わせを説明します。以下を bash または zsh に入力して、実際に確認してください (\e
を に置き換える必要がある場合があります\x1b
)。
for fg in {30..37} 39; do for bg in {40..47} 49; do printf "\e[${fg};${bg}m~TEST~"; done; printf "\n"; done;
結果:
クイックリファレンス(カラー)
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| fg | bg | color |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| 30 | 40 | black |
| 31 | 41 | red |
| 32 | 42 | green |
| 33 | 43 | yellow |
| 34 | 44 | blue |
| 35 | 45 | magenta |
| 36 | 46 | cyan |
| 37 | 47 | white |
| 39 | 49 | default |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
グラフィックレンディションの選択 (SGR)
SGR ではテキストを変更することしかできません。これらの多くは特定の端末では機能しないため、実稼働レベルのプロジェクトでは控えめに使用してください。ただし、プログラム出力を読みやすくしたり、異なるタイプの出力を区別したりするのに役立ちます。
Color は実際には SGR に該当するため、構文は同じです。
CSI
n
m
CSI
: エスケープ文字—^[[
またはESC[n
: 数値(次のいずれか)0
: リセット1
-9
: さまざまなテキスト効果をオンにします21
-29
: さまざまなテキスト効果をオフにします (1
-よりもサポートが少ない9
)30
-37
,39
: 前景色40
-47
,49
: 背景色38
: 8ビットまたは24ビットの前景色(8/24ビットカラー下に)48
: 8ビットまたは24ビットの背景色(8/24ビットカラー下に)
m
: リテラルASCIIm
—エスケープシーケンスを終了します
薄い文字 (2)、斜体 (3)、下線 (4)、点滅 (5,6)、反転表示 (7)、隠す (8)、取り消し線 (9) のサポートはわずかですが、一部 (すべてではないが) は Linux および OS X 端末で動作する傾向があります。
また、上記の属性はいずれもセミコロンで区切ることができることにも注意してください。たとえば、は にがprintf '\e[34;47;1;3mCRAZY TEXT\n'
表示され、は になります。CRAZY TEXT
blue foreground
white background
bold
italic
例えば:
実行できるすべてのテキスト効果を確認するには、bash または zsh シェルに次のコードを入力します。(\e
を に置き換える必要がある場合があります\x1b
。)
for i in {1..9}; do printf "\e[${i}m~TEST~\e[0m "; done
結果:
私の端末はすべてのテキスト効果をサポートしていることがわかりますを除外するのためにかすかな(2)隠す(8)そして取り消し線を引く(9)
クイック リファレンス (SGR 属性 0 ~ 9)
+~~~~~+~~~~~~~~~~~~~~~~~~+
| n | effect |
+~~~~~+~~~~~~~~~~~~~~~~~~+
| 0 | reset |
| 1 | bold |
| 2 | faint* |
| 3 | italic** |
| 4 | underline |
| 5 | slow blink |
| 6 | rapid blink* |
| 7 | inverse |
| 8 | conceal* |
| 9 | strikethrough* |
+~~~~~+~~~~~~~~~~~~~~~~~~+
* not widely supported
** not widely supported and sometimes treated as inverse
8ビットカラー
0-7
ほとんどの端末ではこれをサポートしていますが、9
色ほどサポートされていません。
構文:
CSI
38;5;
n
m
CSI
: エスケープ文字—^[[
またはESC[38;5;
: 前景色に8ビットカラーを使用することを示すリテラル文字列n
: 数値(次のいずれか)0
-255
ターミナルですべての色をうまくプレビューしたい場合は、gist.github.com の素晴らしいスクリプト。
次のようになります:
8 ビット カラーを使用して背景を変更する場合は、 を38
に置き換えます48
。
CSI
48;5;
n
m
CSI
: エスケープ文字—^[[
またはESC[48;5;
: 背景に8ビットカラーを使用することを示すリテラル文字列n
: 数値(次のいずれか)0
-255
24ビットカラー
トゥルーカラーとしても知られる24ビットカラーは、非常に優れた機能を提供します。この機能のサポートは確実に拡大しています(私の知る限り、ほとんどの最新端末で動作しますが、ウルクス、私の端末[怒った絵文字を挿入]。
24ビットカラーはvimで実際にサポートされています(vim ウィキ24 ビット カラーを有効にする方法を確認してください。これは、gvim 用に定義されたカラー スキームから取得するので、非常に便利です。たとえば、highlight guibg=#______ guifg=#______
24 ビット カラーには fg/bg を使用します。便利ですよね。
24 ビット カラーの仕組みは次のとおりです。
CSI
38;2;
r
;
g
;
b
m
CSI
: エスケープ文字—^[[
またはESC[38;2;
: 前景色に24ビットカラーを使用することを示すリテラル文字列r
、、g
:b
数字(それぞれは0
-)255
テストする少しだけ使用できる色は数多くありますが ((2^8)^3
または、2^24
可能16777216
性はたくさんあると思います)、これを bash または zsh で使用できます。
for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "\e[38;2;${r};${g};${b}m($r,$g,$b)\e[0m "; done; printf "\n"; done; done;
結果(これはgnomeターミナル以来ウルクス24ビットカラーをサポートしていません... しっかりしてください、urxvt のメンテナーさん... 本当に):
背景に 24 ビット カラーが必要な場合は、次のよう38
に置き換えるだけです48
。
CSI
48;2;
r
;
g
;
b
m
CSI
: エスケープ文字—^[[
またはESC[48;2;
: 背景に24ビットカラーを使用することを示すリテラル文字列r
、、g
:b
数字(それぞれは0
-)255
生のエスケープシーケンスの挿入
時には\e
、そしてが\x1b
機能しないこともあります。例えば、シュシェル、時々どちらも動作しない(ただし私のシステムでは動作する)今(以前はそうではなかったと思います)。
CTRLこれを回避するには、 + V、CTRL+ [、またはCTRLV、を使用します。ESC
これにより、「生の」文字 (ASCII: 27) が挿入されますESC。次のようになります^[
が、心配しないでください。これは 1 文字だけで、2 文字ではありません。
例えば:
呪い
参照Curses (プログラミングライブラリ) ページcurses の完全なリファレンスについては、こちらを参照してください。curses は、UNIX および UNIX ライクなオペレーティング システムでのみ動作することに注意してください。
Curses を使い始める
検索エンジンを使えば、私よりもずっとわかりやすく説明しているウェブサイトへのリンクが表示されるので、あまり詳しく説明はしませんが、ここで簡単に説明して例を挙げたいと思います。
ANSI エスケープではなく curses を使用する理由は何ですか?
上記のテキストを読んだ場合、\e
または\x1b
が で機能する場合があることを思い出すかもしれませんprintf
。実際、 や\e
が\x1b
まったく機能しない場合もあります (これは標準ではなく、私はこのような端末で作業したことがありませんが、可能性はあります)。さらに重要なのは、より複雑なエスケープ シーケンス (Homeやその他の複数文字のキー) をすべての端末でサポートすることが難しいことです (terminfo と termcap を解析し、すべての端末の処理方法を理解するために多くの時間と労力を費やすつもりがない限り)。
Curses はこの問題を解決します。基本的に、以下の方法を使用して、端末がどのような機能を持っているかを理解できます (上記のリンク先の Wikipedia の記事で説明されているとおり)。
curses のほとんどの実装では、何千もの異なる端末の機能を記述できるデータベースを使用します。端末データベースではなく、専用のデバイス ドライバーを使用する PDCurses などの実装もいくつかあります。ほとんどの実装では terminfo を使用しますが、termcap を使用するものもあります。curses には、文字セル端末へのバックポータビリティとシンプルさという利点があります。ビットマップ グラフィックスや複数のフォントを必要としないアプリケーションの場合、curses を使用したインターフェイス実装は、通常、X ツールキットを使用したものよりはるかにシンプルで高速です。
ほとんどの場合、curses は terminfo をポーリングして、カーソルとテキスト属性の操作方法を理解できるようになります。その後、プログラマーは、必要な機能が必要な場合は、curses が提供する API を使用してカーソルを操作したり、テキストの色やその他の属性を変更したりします。
Pythonの例
Python は本当に使いやすいと思いますが、別のプログラミング言語で curses を使用したい場合は、duckduckgo などの検索エンジンで検索してください。 :) 以下は Python 3 での簡単な例です。
import curses
def main(stdscr):
# allow curses to use default foreground/background (39/49)
curses.use_default_colors()
# Clear screen
stdscr.clear()
curses.init_pair(1, curses.COLOR_RED, -1)
curses.init_pair(2, curses.COLOR_GREEN, -1)
stdscr.addstr("ERROR: I like tacos, but I don't have any.\n", curses.color_pair(1))
stdscr.addstr("SUCCESS: I found some tacos.\n", curses.color_pair(2))
stdscr.refresh() # make sure screen is refreshed
stdscr.getkey() # wait for user to press key
if __name__ == '__main__':
curses.wrapper(main)
結果:
これはかなり回りくどいやり方だと思うかもしれないが、実際にはクロスプラットフォーム(少なくともUNIXやUNIXライクなプラットフォームの世界ではクロスターミナル)である。色に関しては、とても同じくらい重要ですが、他の複数シーケンスのエスケープ シーケンス ( Home、、、など)をサポートする場合、curses はさらに重要になります。EndPage UpPage Down
Tput の例
tput
カーソルとテキストを操作するためのコマンドラインユーティリティですtput
パッケージに付属していますcurses
。ターミナルでクロスターミナル (っぽい) アプリケーションを使用する場合は、tput を使用する必要があります。これは、terminfo または必要なものを解析し、標準化されたコマンド セット (curses など) を使用して、正しいエスケープ シーケンスを返します。- 例:
echo "$(tput setaf 1)$(tput bold)ERROR:$(tput sgr0)$(tput setaf 1) My tacos have gone missing"
echo "$(tput setaf 2)$(tput bold)SUCCESS:$(tput sgr0)$(tput setaf 2) Oh good\! I found my tacos\!"
結果:
Tput の詳細情報
- 見る:lc3_adv_tput.php は、Linux の標準のコマンドです。tputがどのように動作するかを見る
- 見る:http://invisible-island.net/ncurses/man/terminfo.5.html使用できるコマンドのリストについては