特定のUnicode文字が私の端末に印刷されないのはなぜですか?

特定のUnicode文字が私の端末に印刷されないのはなぜですか?

私は単純な端末を介して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のドキュメント説明する:

printfISO C 99で導入された2つの文字構文の説明: \u16ビットUnicode(ISO / IEC 10646)文字の場合は、4桁の16進数で指定されていますヘヘ\U32ビットの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進数)

つまり、\u5桁の16進数では機能しません。それは\U

# printf "\u2660 \u1F0A1 \U1F0A1\n"
♠ Ἂ1 

答え2

Muruの答えは完全に正確ですが、明確にするために次のように説明します。

印刷すると、\u1F0A116ビットのUnicodeエスケープ\u1F0Aとリテラル文字として解釈されます1\uなぜなら4つそれ以上でもそれ以下でもない文字)。 U + 1F0Aは、複数の発音区別記号を持つギリシャ文字を提供します(PsiliとVariaを含むギリシャの大文字Alpha、正確に言えば)。

Unicodeエスケープで16ビット以上が必要な場合は、Pokerを使用する必要があります。これ\Uには8桁の16進値が必要です。\U0001F0A1

関連情報