やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

色が共有できない問題

 ANSI Escape CodeにてFull Color以外をもちいると環境ごとに色が変わってしまいうる。

成果物

情報源

ANSI Escape Codeの色空間

bit name 概要 コード
3 Standard Colors 標準8色 echo -e "\e[33m対象\e[m"
3 High Intensity Colors 高輝度8色 echo -e "\e[93m対象\e[m"
8 Index Color 256色(0-7:Standard Colors, 8-15:High Intensity Colors, 232-255:Gray Scale, 16-231:Safe Colors) echo -e "\e[38;5;11m対象\e[m"
24 Full Color 1677万色 echo -e "\e[38;2;255;255;0m対象\e[m"

ターミナルの色

 ターミナルの設定でStandard ColorsとHigh Intensity Colorsの色をつぎのように変更できてしまう。私はデフォルトの色だと見えにくかったので、明るめにした。

f:id:ytyaru:20210530142537p:plain

 これはつまり、色は環境によって変わってしまうことを意味している。

問題

 3bitカラーにはつぎの問題がある。

  • 色が共有できない
  • 太字にするとハイライトになってしまう

色が共有できない

 Standard ColorsとHigh Intensity Colorsはターミナルの設定によって変更できる。また、Index Colorのうち、0-15はそれらと同じ色である。つまり、これらの色は環境ごとに変わってしまいうる。すべての環境で共通の色として指定できない。

f:id:ytyaru:20210530142537p:plain

太字にするとハイライトになってしまう

 Standard Colorsを使うと、太字強調したときHigh Intensity Colorsになってしまう。

echo -e "\e[33mStandard Colors\e[m"
echo -e "\e[1;33mStandard Colors+太字強調\e[m"
echo -e "\e[93mHigh Intensity Colors\e[m"
echo -e "\e[1;93mHigh Intensity Colors+太字強調\e[m"

対策

 24bitカラーを使うと解決する。

  • ハイライトせず太字にする
  • 色を絶対値で指定する(異なる環境でも同じ色にする)

f:id:ytyaru:20210602093833p:plain

echo -e "\e[38;2;232;172;64mFull Colors 232;172;64\e[m"
echo -e "\e[1;38;2;232;172;64mFull Colors 232;172;64+太字強調m\e[m"
echo -e "\e[38;2;255;255;0mFull Colors 255;255;0\e[m"
echo -e "\e[1;38;2;255;255;0mFull Colors 255;255;0+太字強調\e[m"

 ただし、24bitカラーが使えるかどうかはターミナルの環境次第である。結局、環境問題からは逃げられない。

結論

 各環境にあわせた実装を用意するしかない。

色深度 実装率 共有率 概要
1bit mono echo "対象"
3bit Standard Colors echo -e "\e[33m対象\e[m"
4bit High Intensity Colors echo -e "\e[93m対象\e[m"
8bit Index Color echo -e "\e[38;5;11m対象\e[m"
24bit Full Color echo -e "\e[38;2;255;255;0m対象\e[m"