web-dev-qa-db-ja.com

一部のUnicode文字が端末に出力されないのはなぜですか?

私はAdobe Source Code Proフォントを使用したシンプルなターミナルでArch Linuxを実行しています。私のロケールは正しくLANG=en_US.UTF-8に設定されています。

トランプを表すUnicode文字を端末に出力したい。私は 参考としてWikipedia を使用しています。

カードスーツのUnicode文字は正常に機能します。たとえば、発行

$ printf "\u2660"

画面に黒いハートを印刷します。

しかし、私は特定のトランプで問題を抱えています。発行中

$ printf "\u1F0A1"

スペードのエース????ではなく、シンボルἊ1を出力します。何が問題になっていますか?

この問題は、いくつかの端末(urxvt、xterm、シロアリ)や、私が試したすべてのフォント(DejaVu、Inconsolata)でも解消されません。

16

_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 ????
_
27
muru

ムルの答えは完全に正しいですが、ただ一つのポイントを明確にするためです:

\u1F0A1を印刷すると、16ビットのUnicodeエスケープ\u1F0Aとして解釈され、その後にリテラル文字1が続きます(\uは次のようになるため4文字文字、それ以上、それ以下)。次に、U + 1F0Aは、2つの付加記号を含むギリシャ語のアルファ(ギリシャ語の大文字のアルファとプシリとバリア)を正確)。

Unicodeエスケープに16ビット以上が必要な場合は、\Uを使用する必要があります。これには8文字分の16進数が必要です。\U0001F0A1はトランプを提供します。

2
Draconis