色が共有できない問題
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の色をつぎのように変更できてしまう。私はデフォルトの色だと見えにくかったので、明るめにした。
これはつまり、色は環境によって変わってしまうことを意味している。
問題
3bitカラーにはつぎの問題がある。
- 色が共有できない
- 太字にするとハイライトになってしまう
色が共有できない
Standard ColorsとHigh Intensity Colorsはターミナルの設定によって変更できる。また、Index Colorのうち、0-15はそれらと同じ色である。つまり、これらの色は環境ごとに変わってしまいうる。すべての環境で共通の色として指定できない。
太字にするとハイライトになってしまう
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カラーを使うと解決する。
- ハイライトせず太字にする
- 色を絶対値で指定する(異なる環境でも同じ色にする)
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" |