UTF-8シンボルを印刷する方法

UTF-8シンボルを印刷する方法

bashコマンドを使用して端末にUTF-8シンボルを印刷する方法。

これは効果があります

echo -e '\U2586'

しかし、以下は失敗します

printf '%s\n' $(tput setaf 118) "\\u2586" $(tput sgr0)

答え1

printfBashの型文字列の後にあるパラメータでバックスラッシュエスケープシーケンスを拡張するには、次の手順を実行する必要があります。使用%b%sフォーマット文字列の代わりに:

printf '%b\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"

3つの引数があるので、おそらくこれがより適切かもしれません。

printf '%s%b%s\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"

〜のようにスティーブン・チャジェラスこれは、現在のロケールの文字セットからU + 2586文字のエンコードを出力します。 UTF-8の場合、結果はUTF-8です。他の文字セットはさまざまです。文字セットがU + 2586を表すことができない場合、結果は文字列 "\u2586"になります(zshは「範囲外の文字」エラーで失敗します)。

これにより、ほとんどの場合、目的の動作が生成されます。可能であれば「▆」と表示されます。もしあなたなら本物文字のUTF-8表現を出力するには、すべての場合にロケールをオーバーライドしてそれを強制できます。例えば

LC_ALL= LC_CTYPE=en_US.UTF-8 printf '%s%b%s\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"

(望むよりLANG = CとLC_ALL = Cの違いは何ですか?上記で使用した変数の設定に関する注意事項です。 )

答え2

\uxxxxとのサポートは、2000年にスタンドアロンユーティリティのGNU実装\UXXXXXXXXに最初に追加されましたが、他のエスケープシーケンスと同様に、型引数または指定子の引数でのみ認識されます。文字列をそのまま表示するためには使用されません。printf%b%s

printfその後、2003年に組み込み機能(/およびTherezshにも該当)、2004年にksh93、2010年にbash(4.2)に追加され、それ以降、おそらくいくつかの組み込み機能が追加されているはずです。echoprint$'...'

しかし、これは標準ではありません。計画があるPOSIX は$'...'ksh93 の引用形式を指定します。\u/シーケンスを許可し\Uますが、現在の問題の1つは、これらの引用符を使用してコマンドを解析および/または実行するときに、現在のロケールの文字セットがUTF-8でない場合に拡張を処理する方法です。

それにもかかわらず、スクリプトはUTF-8文字セットを使用するロケールで始まり、それ以降)LC_CTYPE変数としてLC_ALLLANG$'\uxxxx'

$'\UXXXXXXXX'コードポイントが0xFFFFより高い文字に使用されます。一部のシェルには4桁の数字\uと8桁の数字の両方が必要です\U。したがって、移植性を最大化するには、またはを使用してください$'St\u00E9phane'。必要なすべてのシェルは16進数であるため、16進数として扱われます。サポートされているシェルの場合、または を使用し、引用符演算子を混在させることもできます。$'St\U000000E9phane'StéphaneSt\u00E9fanStéfan$'St\ue9fanSt \U0E9F anef$'\ue9'$'St\ue9'$'fan'St$'\ue9'fan

printfその後、これらの拡張をすべてのコマンドまたは他のコマンドに渡すことができます。

特別な場合にzshはのprint内蔵機能を使用できます。

print -P '%F{118}\u2586%f'

-Pコマンドを実行しなくても、プロンプト拡張で前景色を設定できますtput。または:

print -rP '%F{118}'$'\u2586''%f'

ここでエスケープシーケンスを無効にし、引用符を使用して-r文字通りU + 2586文字を渡します。print$'...'

または:

arbitrary_text=$'\u2586'' arbitrary text with \backslash and % characters'
print -r -- ${(%):-%F{118}}$arbitrary_text${(%):-%f}

拡張は行われませんが、引数拡張フラグprintによってカラーエスケープシーケンスが生成され、%U + 2586が変数にそのまま格納されます。印刷-r

関連情報