私は単純な端末を介してArch Linuxを実行するためにAdobe Source Code Proフォントを使用しています。私のロケールがに正しく設定されていますLANG=en_US.UTF-8
。
トランプを表すUnicode文字を私の端末に印刷したいです。私はそれを使用しています参考用ウィキペディア。
カードスーツのUnicode文字はうまく機能します。たとえば、問題
$ printf "\u2660"
画面に黒いハートを印刷します。
しかし、特定のカードに問題があります。発行された
$ printf "\u1F0A1"
Ἂ1
スペードエースの代わりにシンボルを印刷
答え1
help printf
解釈されたエスケープシーケンスに従いprintf(1)
、GNU printfのドキュメント説明する:
printf
ISO C 99で導入された2つの文字構文の説明:\u
16ビットUnicode(ISO / IEC 10646)文字の場合は、4桁の16進数で指定されていますヘヘ、\U
32ビットのUnicode文字の場合は、8桁の16進数で指定されます。はははは。 Unicode文字はロケール設定printf
に従って出力されます。LC_CTYPE
この構文は、U+0024($)、U+0040(@)、U+0060(`) を除いて U+0000… U+009F、U+D800… U + DFFF範囲のUnicode文字を指定できません。
Bashのマニュアルは同様のものを指定しますANSI C見積もりそしてecho
:
\uHHHH
値が16進値のUnicode(ISO / IEC 10646)文字はははは(1~4個の16進数)
\UHHHHHHHH
値が16進値のUnicode(ISO / IEC 10646)文字ハハハハハハハ(1~8桁の16進数)
つまり、\u
5桁の16進数では機能しません。それは\U
:
# printf "\u2660 \u1F0A1 \U1F0A1\n"
♠ Ἂ1
答え2
Muruの答えは完全に正確ですが、明確にするために次のように説明します。
印刷すると、\u1F0A1
16ビットのUnicodeエスケープ\u1F0A
とリテラル文字として解釈されます1
(\u
なぜなら4つそれ以上でもそれ以下でもない文字)。 U + 1F0Aは、複数の発音Ἂ
区別記号を持つギリシャ文字を提供します(PsiliとVariaを含むギリシャの大文字Alpha、正確に言えば)。
Unicodeエスケープで16ビット以上が必要な場合は、Pokerを使用する必要があります。これ\U
には8桁の16進値が必要です。\U0001F0A1