Ich verwende Arch Linux mit einem einfachen Terminal und der Schriftart Adobe Source Code Pro. Mein Gebietsschema ist korrekt eingestellt auf LANG=en_US.UTF-8
.
Ich möchte Unicode-Zeichen für Spielkarten auf meinem Terminal drucken. Ich verwende Wikipedia als Referenz .
Die Unicode-Zeichen für Karten passen gut. Zum Beispiel beim Ausstellen
$ printf "\u2660"
druckt ein schwarzes Herz auf den Bildschirm.
Ich habe jedoch Probleme mit bestimmten Spielkarten. Ausgabe
$ printf "\u1F0A1"
druckt das Symbol Ἂ1
anstelle des Pik-As 🂡. Was läuft falsch?
Dieses Problem besteht weiterhin auf mehreren Terminals (urxvt, xterm, termite) und allen von mir getesteten Schriftarten (DejaVu, Inconsolata).
Antworten:
help printf
verzögert sichprintf(1)
für die interpretierten Escape-Sequenzen, und die Dokumentation für GNU printf sagt:Ähnliches ist im Bash-Handbuch für ANSI C Quoting angegeben und
echo
:Kurz gesagt:
\u
ist nicht für 5 Hex-Ziffern. Es ist\U
:quelle
Murus Antwort ist völlig richtig, um nur einen Punkt zu verdeutlichen:
Beim Drucken
\u1F0A1
wird dies als 16-Bit-Unicode-Escape interpretiert\u1F0A
, gefolgt vom Literalzeichen1
(da\u
die folgenden vier Zeichen verwendet werden, nicht mehr und nicht weniger). U + 1F0A ergibt dannἊ
ein griechisches Alpha mit ein paar diakritischen Zeichen ( griechischer Großbuchstabe Alpha mit Psili und Varia , um genau zu sein).Wenn Sie mehr als sechzehn Bits für Ihre Unicode-Escape-Funktion verwenden möchten, müssen Sie
\U
Folgendes verwenden: Hexadezimaler Wert von acht Zeichen: Gibt Ihnen die\U0001F0A1
Spielkarte.quelle
\U0001F0A1
ist eigentlich tragbarer als\U1F0A1
. Es ist das GNU-Standalone-printf
Dienstprogramm, das diese\uXXXX
/\UXXXXXXXX
Sequenzen zuerst eingeführt hat, und es erfordert 4 Ziffern für\u
und 8 für\U
. Andereprintf
Implementierungen wie das Built-in der GNU-Shell, ksh93 und zsh, sind lockerer. In jedem Fallprintf '\u/\U'
handelt es sich nicht um POSIX. POSIX spezifiziert jedoch zshs$'\U1F0A1'
und benötigt nicht alle 8 Ziffern.\uxxxx
ist bis zu 4 Ziffern und\Uxxxxxxxx
ist bis zu 8 Ziffern. Beachten Sie, dass Unicode jetzt auf die Codepunkte 0 bis 0x10FFFF beschränkt ist (eine Einschränkung durch UTF16), sodass Codepunkte nie mehr als 6 Stellen haben (sie werden immer\U123456789
noch als Zeichen des Codepunkts 0x12345678 interpretiert, gefolgt von9
und schlagen fehl). Die POSIX-Spezifikation für$'\u\U'
ist noch nicht fertiggestellt (siehe austingroupbugs.net/view.php?id=249 ). In einem früheren Entwurf waren alle 4/8-Stellen erforderlich, dies wurde jedoch später geändert (auf meine Anfrage).