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


16

Adobe Source Code Proフォントを使用した単純な端末でArch Linuxを実行しています。ロケールが正しく設定されていLANG=en_US.UTF-8ます。

トランプを表すUnicode文字を端末に印刷したい。参考としてウィキペディアを使用しています

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

$ printf "\u2660"

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

しかし、特定のトランプで問題があります。発行中

$ printf "\u1F0A1"

Ἂ1スペードaceのエースの代わりにシンボルを表示します。何が悪いの?

この問題は、いくつかの端末(urxvt、xterm、シロアリ)および私が試したすべてのフォント(DejaVu、Inconsolata)で持続します。


警告:これがprintfで処理される場合、これは非標準の拡張機能です。したがって、このようなエスケープが機能するとは思わないでください。参照:pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html
schily

回答:


27

help printfprintf(1)解釈されたエスケープシーケンスに従うため、GNU printfのドキュメントは次のように述べています。

printfISO C 99に導入解釈2つの文字の構文は: \u16ビットUnicode(ISO / IEC 10646)文字の16進数字4として指定HHHH、および\U8進数字として指定された32ビットのUnicode文字を、HHHHHHHH。ロケールprintfに従ってUnicode文字を出力しLC_CTYPEます。U + 0000…U + 009F、U + D800…U + DFFFの範囲のUnicode文字は、U + 0024($)、U + 0040(@)、およびU + 0060( `)を除き、この構文では指定できません。

似たようなのためのBashのマニュアルに指定されているANSI Cは、引用echo

\uHHHH
値が16進数値HHHH(1〜4桁の16進数)であるUnicode(ISO / IEC 10646)文字

\UHHHHHHHH
値が16進数値HHHHHHHH1〜8桁の16進数)であるUnicode(ISO / IEC 10646)文字

要するに:\u5桁の16進数ではありません。それは\U

# printf "\u2660 \u1F0A1 \U1F0A1\n"
 1 🂡

2

Muruの答えは完全に正しいですが、ただ1つのポイントを明確にするためです。

を印刷する場合\u1F0A1、16ビットのUnicodeエスケープとして解釈され\u1F0A、その後にリテラル文字が続きます1\u以下の4文字を使用するため、それ以上でもそれ以下でもありません)。次に、U + 1F0Aは、発音記号が2つ付いたギリシャ語のアルファ(正確にはPsiliとVariaを含むギリシャ語の大文字アルファ)を​​返します。

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


\U0001F0A1実際には、よりも移植性があり\U1F0A1ます。これはprintf最初にそれらの\uXXXX/ \UXXXXXXXXシーケンスを導入したGNUスタンドアロンユーティリティであり、4桁\uと8 桁が必要です\UprintfGNUシェルの組み込み、ksh93およびzshのような他の実装はより緩いです。いずれにしてもprintf '\u/\U'POSIXではありません。ただし、POSIXはzshを指定する$'\U1F0A1'ため、8桁すべてを必要としません。
ステファンシャゼル

@StéphaneChazelas興味深いことに、私はPOSIXが8桁のもので行くといつも考えていました。コードの後に​​余分な文字や数字をキャプチャしないようにする場合、zshでは8桁バージョンがまだ有効であると思いますか?
ドラコニス

はい、\uxxxxあるまで 4桁にして\Uxxxxxxxxいる、最大 8桁に。Unicodeはコードポイント0から0x10FFFF(UTF16によってもたらされる制限)に制限されるようになったため、コードポイントは6桁を超えることはありません(\U123456789コードポイント0x12345678の文字として解釈され、その後に9失敗します)。のPOSIX仕様$'\u\U'はまだ確定していません(austingroupbugs.net/view.php?id=249を参照)。以前のドラフトでは、4/8桁すべてが必要でしたが、後で変更されました(私の要求に応じて)。
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.