私はAdobe Source Code Proフォントを使用したシンプルなターミナルでArch Linuxを実行しています。私のロケールは正しくLANG=en_US.UTF-8
に設定されています。
トランプを表すUnicode文字を端末に出力したい。私は 参考としてWikipedia を使用しています。
カードスーツのUnicode文字は正常に機能します。たとえば、発行
$ printf "\u2660"
画面に黒いハートを印刷します。
しかし、私は特定のトランプで問題を抱えています。発行中
$ printf "\u1F0A1"
スペードのエース????ではなく、シンボルἊ1
を出力します。何が問題になっていますか?
この問題は、いくつかの端末(urxvt、xterm、シロアリ)や、私が試したすべてのフォント(DejaVu、Inconsolata)でも解消されません。
_help printf
_は、解釈されたエスケープシーケンスについてはprintf(1)
に従います GNU printf のドキュメントは次のように述べています:
printf
は、ISO C 99で導入された2つの文字構文を解釈します。_\u
_ 16ビットUnicode(ISO/IEC 10646)文字の場合、4つの16進数字hhhh、および_\U
_(32ビットUnicode文字の場合)、8桁の16進数hhhhhhhhとして指定します。printf
は、_LC_CTYPE
_ロケールに従ってUnicode文字を出力します。 U + 0024($)、U + 0040(@)、およびU + 0060( `)を除き、U + 0000…U + 009F、U + D800…U + DFFFの範囲のUnicode文字はこの構文では指定できません。 。
ANSI C Quoting および echo
については、Bashのマニュアルで同様のものが指定されています。
_
\uHHHH
_
値が16進値であるUnicode(ISO/IEC 10646)文字[〜#〜] hhhh [〜#〜]( 1から4桁の16進数)_
\UHHHHHHHH
_
値が16進値であるUnicode(ISO/IEC 10646)文字[〜#〜] hhhhhhhh [〜#〜]( 1から8桁の16進数)
つまり、_\u
_は5桁の16進数ではありません。それは_\U
_です:
_# printf "\u2660 \u1F0A1 \U1F0A1\n"
♠ Ἂ1 ????
_
ムルの答えは完全に正しいですが、ただ一つのポイントを明確にするためです:
\u1F0A1
を印刷すると、16ビットのUnicodeエスケープ\u1F0A
として解釈され、その後にリテラル文字1
が続きます(\u
は次のようになるため4文字文字、それ以上、それ以下)。次に、U + 1F0AはἊ
、2つの付加記号を含むギリシャ語のアルファ(ギリシャ語の大文字のアルファとプシリとバリア)を正確)。
Unicodeエスケープに16ビット以上が必要な場合は、\U
を使用する必要があります。これには8文字分の16進数が必要です。\U0001F0A1
はトランプを提供します。