Ich möchte meiner Shell-Eingabeaufforderung den Unicode-Totenkopf hinzufügen (insbesondere den 'SKULL AND CROSSBONES' (U + 2620)), aber ich kann die magische Beschwörung nicht herausfinden, um das Echo dazu zu bringen, sie oder andere zu spucken. 4-stelliges Unicode-Zeichen. Zweistellige sind einfach. Zum Beispiel echo -e "\ x55" ,.
Zusätzlich zu den folgenden Antworten sollte beachtet werden, dass Ihr Terminal natürlich Unicode unterstützen muss, damit die Ausgabe Ihren Erwartungen entspricht. gnome-terminal leistet gute Arbeit, ist aber nicht unbedingt standardmäßig aktiviert.
Gehen Sie in der Terminal-App von macOS zu Einstellungen-> Codierungen und wählen Sie Unicode (UTF-8).
bash
shell
unicode
character-encoding
masukomi
quelle
quelle
"\x7F"
einem UTF-8-Gebietsschema gültig ist (was dasbash
Tag für Ihr Land vorschlägt) ... Muster, die durch ein einzelnes Byte dargestellt werden, liegen niemals im Bereich\x80-\xFF
. Dieser Bereich ist in UTF-8-Zeichen mit einem Byte unzulässig. zB ein Unicode-Codepoint-Wert vonU+0080
(dh\x80
) ist tatsächlich 2 Bytes in UTF-8 ..\xC2\x80
..printf "\\u007C\\u001C"
.gnome-terminal
,echo -e '\ufc'
produziert keine ü, auch mit Zeichencodierung Satz UTF-8. Doch zBurxvt
druckt zBprintf "\\ub07C\\ub01C"
wie erwartet (nicht mit einem oder Kasten).bash
Tag so ein nützlicher Hinweis? Sind in CJK verschiedene Terminals gemeinsam oder…?Antworten:
In UTF-8 sind es tatsächlich 6 Ziffern (oder 3 Bytes).
Verwenden Sie hexdump, um zu überprüfen, wie es von der Konsole codiert wird:
quelle
LANG=C
statt benutzteLANG=en_US.UTF-8
. Jetzt zeigen meine Terminals in Gnome die Symbole richtig an ... Die echten Terminals (tty1-6) tun dies jedoch immer noch nicht.0000000 f0 9f 8d ba
übersetzt in\xf0\x9f\x8d\xba
. Beispiel Echo :echo -e "\xf0\x9f\x8d\xba"
.$'...'
Syntax verwenden, um das codierte Zeichen in eine Variable zu übertragen, ohne eine$(...)
Erfassungsunterschale zu verwenden, um sie in Kontexten zu verwenden, die die Escape-Sequenzen nicht selbst interpretieren:skull=$'\xE2\x98\xA0'
0000000 98e2 00a0
. Natürlich0000000
ist das nur ein unwichtiger Offset, aber die Bytes danach werden übersetzt\xe2\x98\xa0
, weil die Maschine die Little-Endian-Bytereihenfolge verwendet.Dies funktioniert in Zsh (ich habe Version 4.3 überprüft) und in Bash 4.2 oder neuer.
quelle
Solange Ihre Texteditoren mit Unicode (vermutlich in UTF-8 codiert) umgehen können, können Sie den Unicode-Codepunkt direkt eingeben.
Zum Beispiel würden Sie im Vim -Texteditor in den Einfügemodus wechseln und Ctrl+ V+ Uund dann die Codepunktnummer als 4-stellige Hexadezimalzahl drücken (Pad mit Nullen, falls erforderlich). Sie würden also Ctrl+ V+ eingeben U 2 6 2 0. Siehe: Was ist der einfachste Weg, um Unicode-Zeichen in ein Dokument einzufügen?
An einem Terminal läuft Bash Sie würde geben CTRL+ SHIFT+ Uund geben Sie die Hexadezimal - Code-Nummer des Zeichens Sie wollen. Während der Eingabe sollte Ihr Cursor unterstrichen sein
u
. Die erste nicht eingegebene Ziffer beendet die Eingabe und rendert das Zeichen. So können Sie U + 2620 in Bash wie folgt drucken:echo CTRL+ SHIFT+U2620ENTERENTER
(Die erste Eingabe beendet die Unicode-Eingabe und die zweite führt den
echo
Befehl aus.)Gutschrift: Fragen Sie Ubuntu SE
quelle
C-S-u 2 6 2 0
ist eine Funktion Ihres Terminalemulators, der X-Eingabemethode (XIM) oder ähnlichem. AFAIK, Sie können nicht beideSHIFT
undCTRL
an die Terminalschicht senden . Das Terminal spricht nur in Zeichen und nicht in Schlüsselsymbolen und Schlüsselcodes wie Ihrem X-Server (außerdem ist es in jeder Hinsicht 7-Bit). In dieser WeltCTRL
maskiert die 4 höchstwertigen Bits (& 0b00001111), was zuHier ist eine vollständig interne Bash-Implementierung, keine Verzweigung, unbegrenzte Größe von Unicode-Zeichen.
Ausgabe war:
quelle
Fügen Sie einfach "☠" in Ihr Shell-Skript ein. Im richtigen Gebietsschema und auf einer Unicode-fähigen Konsole wird einwandfrei gedruckt:
Eine hässliche "Problemumgehung" wäre die Ausgabe der UTF-8-Sequenz, dies hängt jedoch auch von der verwendeten Codierung ab:
quelle
Schneller Einzeiler zum Konvertieren von UTF-8-Zeichen in ihr 3-Byte-Format:
quelle
printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u)
.... xxd wird als Teil des 'vim-hexFromGlyph(){ if [ "$1" == "-n" ]; then outputSeparator=' '; shift; else outputSeparator='\n'; fi for glyph in "$@"; do printf "\\\x%s" $(printf "$glyph"|xxd -p -c1 -u); echo -n -e "$outputSeparator"; done } # usage: $ hexFromGlyph ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF $ hexFromGlyph -n ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF
codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z
... genießen Sie 👍Ich benutze dies:
Dies ist ziemlich einfacher als das Durchsuchen einer Hex-Darstellung ... Ich verwende dies in meinen Shell-Skripten. Das funktioniert auf gnome-term und urxvt AFAIK.
quelle
Möglicherweise müssen Sie den Codepunkt als Oktal codieren, damit die sofortige Erweiterung ihn korrekt decodiert.
U + 2620, codiert als UTF-8, ist E2 98 A0.
Also in Bash,
wird Ihre Muschel schnell in Schädel und Knochen verwandeln.
quelle
Verwenden Sie in Bash zum Drucken eines Unicode-Zeichens zur Ausgabe \ x, \ u oder \ U (erstens für zweistelliges Hex, zweitens für 4-stelliges Hex, drittes für eine beliebige Länge).
Wenn Sie es einer Variablen zuweisen möchten, verwenden Sie die Syntax $ '...'
quelle
Wenn Ihnen ein Perl-Einzeiler nichts ausmacht:
-CS
Aktiviert die UTF-8-Decodierung bei der Eingabe und die UTF-8-Codierung bei der Ausgabe.-E
wertet das nächste Argument als Perl aus, wobei moderne Funktionen wiesay
aktiviert sind. Wenn Sie am Ende keinen Zeilenumbruch wünschen, verwenden Sieprint
anstelle vonsay
.quelle
Jeder dieser drei Befehle druckt das gewünschte Zeichen in einer Konsole, vorausgesetzt, die Konsole akzeptiert UTF-8- Zeichen (die meisten aktuellen):
Anschließend können Sie das eigentliche Symbol (Bild, Zeichen) in einen beliebigen (UTF-8-fähigen) Texteditor kopieren und einfügen.
Wenn Sie sehen möchten, wie ein solcher Unicode-Codepunkt in UTF-8 codiert ist, verwenden Sie xxd (viel besserer Hex-Viewer als od):
Oder in HEX, um Fehler zu vermeiden: 0xE2 0x98 0xA0. Das heißt, die Werte zwischen dem Leerzeichen (HEX 20) und dem Zeilenvorschub (Hex 0A).
Wenn Sie tief in die Konvertierung von Zahlen in Zeichen eintauchen möchten, lesen Sie hier einen Artikel aus Gregs Wiki (BashFAQ) über die ASCII-Codierung in Bash!
quelle
Das
printf
eingebaute (genau wie das der Coreutilsprintf
) kennt die\u
Escape-Sequenz, die 4-stellige Unicode-Zeichen akzeptiert:Test mit Bash 4.2.37 (1):
quelle
\printf
, die eigenständige ausführbare Datei zu verwenden, oder versuchen Sie es mit einem aktualisierten bashEntschuldigen Sie, dass Sie diese alte Frage wiederbelebt haben. Bei der Verwendung
bash
gibt es jedoch einen sehr einfachen Ansatz zum Erstellen von Unicode-Codepunkten aus einfachen ASCII-Eingaben, der sich überhaupt nicht verzweigt :Verwenden Sie es wie folgt, um bestimmte Codepunkte zu definieren
oder um die ersten 65536-Unicode-Codepunkte auf stdout abzulegen (dauert auf meinem Computer weniger als 2 Sekunden. Der zusätzliche Speicherplatz verhindert, dass bestimmte Zeichen aufgrund der Monospace-Schriftart der Shell ineinander fließen):
oder um eine kleine, sehr typische Elterngeschichte zu erzählen (dies erfordert Unicode 2010):
Erläuterung:
printf '\UXXXXXXXX'
druckt ein beliebiges Unicode-Zeichen ausprintf '\\U%08x' number
druckt\UXXXXXXXX
mit der in Hex konvertierten Zahl, diese wird dann einer anderen zugeführt,printf
um das Unicode-Zeichen tatsächlich auszudruckenprintf
erkennt Oktal (0oct), Hex (0xHEX) und Dezimal (0 oder Zahlen, die mit 1 bis 9 beginnen) als Zahlen, sodass Sie auswählen können, welche Darstellung am besten passtprintf -v var ..
sammelt die Ausgabe vonprintf
in einer Variablen ohne Gabel (was die Dinge enorm beschleunigt)local variable
ist da, um den globalen Namespace nicht zu verschmutzenlocal -n var=other
Aliasevar
zuother
, so dass sich die Zuordnung zuvar
ändertother
. Ein interessanter Teil hier ist, dass ervar
Teil des lokalen Namespace ist, während erother
Teil des globalen Namespace ist.local
oderglobal
Namespace inbash
. Variablen werden in der Umgebung gespeichert und sind immer global. Local löscht nur den aktuellen Wert und stellt ihn wieder her, wenn die Funktion wieder verlassen wird. Andere Funktionen, die innerhalb der Funktion mit aufgerufenlocal
werden, sehen weiterhin den "lokalen" Wert. Dies ist ein grundlegend anderes Konzept als alle normalen Scoping-Regeln, die in anderen Sprachen zu finden sind (und wasbash
funktioniert, ist sehr leistungsfähig, kann aber zu Fehlern führen, wenn Sie ein Programmierer sind, der sich dessen nicht bewusst ist).quelle
Hier ist eine Liste aller verfügbaren Unicode-Emojis:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
Beispiel:
Verwenden Sie hexdump, um den ASCII-Wert dieses Zeichens abzurufen
Verwenden Sie dann die im Hex-Format angegebenen Werte
quelle
Basierend auf Fragen zum Stapelüberlauf Unix schneiden, entfernen Sie das erste Token und https://stackoverflow.com/a/15903654/781312 :
Die Ausgabe ist die folgende.
quelle
Einfach mit einem Python2 / 3-Einzeiler:
Ergebnisse in:
quelle
In Bash:
Ausgabe:
quelle
Wenn der Hex-Wert des Unicode-Zeichens bekannt ist
Wenn der Dezimalwert eines Unicode-Zeichens bekannt ist
quelle