UTF-8
ist eine Codierung mit variabler Länge für Unicode. Es ist so konzipiert, dass es eine Obermenge von ASCII ist. Einzelheiten zur Kodierung finden Sie in Wikipedia . \x00 \x01 \xF6 \x15
wäre UCS-4BE
oder UTF-32BE
Kodierung.
Wenn Sie vom Unicode-Codepunkt zur UTF-8-Codierung gelangen möchten, gehen Sie davon aus, dass das Charmap des Gebietsschemas UTF-8 ist (siehe die Ausgabe von locale charmap
).
$ printf '\U1F615\n'
😕
$ echo -e '\U1F615'
😕
$ confused_face=$'\U1F615'
Letzteres wird in der nächsten Version des POSIX-Standards enthalten sein .
AFAIK, dass Syntax wurde im Jahr 2000 durch das Stand-alone - GNU eingeführt printf
Dienstprogramm (im Gegensatz zu dem printf
Nutzen des GNU - Shell), geholt echo
/ printf
/ $'...'
builtins ersten von zsh
2003 , ksh93 2004 bash im Jahr 2010 (wenn auch nicht richtig dort arbeitet bis 2014 ), wurde aber offensichtlich von anderen Sprachen inspiriert.
ksh93
unterstützt es auch als printf '\x1f615\n'
und printf '\u{1f615}\n'
.
$'\uXXXX'
und $'\UXXXXXXXX'
werden unterstützt von zsh
, bash
, ksh93
, mksh
und FreeBSD sh
, GNU printf
, GNU echo
.
Einige erfordern alle Ziffern (im \U0001F615
Gegensatz zu \U1F615
), obwohl dies in zukünftigen Versionen wahrscheinlich geändert wird, da POSIX weniger Ziffern zulässt. In jedem Fall müssen Sie alle Ziffern , wenn die \UXXXXXXXX
durch hexadezimale Ziffern wie in gefolgt werden soll \U0001F615FOX
, wie es \U1F615FOX
gewesen wäre $'\U001F615F'OX
.
Einige werden zu dem Zeitpunkt, zu dem die Zeichenfolge analysiert wird, oder zu dem Zeitpunkt, zu dem sie erweitert wird, auf die Zeichen in der Codierung des aktuellen Gebietsschemas erweitert, andere nur in UTF-8, unabhängig vom Gebietsschema. Wenn das Zeichen in der Codierung des aktuellen Gebietsschemas nicht verfügbar ist, variiert das Verhalten zwischen den Shells.
Um eine optimale Portabilität zu erzielen, verwenden Sie es am besten nur in UTF-8-Gebietsschemas und verwenden Sie alle Ziffern und verwenden Sie es in $'...'
:
printf '%s\n' $'\U0001F615'
Beachten Sie, dass:
LC_ALL=C.UTF-8; printf '%s\n' $'\U0001F615'
oder:
{
LC_ALL=C.UTF-8
printf '%s\n' $'\U0001F615'
}
Wird nicht mit allen Schalen (einschließlich arbeiten bash
) , weil das $'\U0001F615'
wird analysiert , bevor LC_ALL
zugeordnet ist. (Beachten Sie auch, dass es keine Garantie dafür gibt, dass ein System ein genanntes Gebietsschema hat. C.UTF-8
)
Sie brauchen:
LC_ALL=C.UTF-8; eval "confused_face=$'\U0001F615'"
Oder:
LC_ALL=C.UTF-8
printf '%s\n' $'\U0001F615'
(Nicht innerhalb eines zusammengesetzten Befehls oder einer zusammengesetzten Funktion).
Um von der UTF-8-Codierung zum Unicode-Codepunkt zu gelangen, lesen Sie diese oder jene andere Frage .
$ unicode 😕
U+1F615 CONFUSED FACE
UTF-8: f0 9f 98 95 UTF-16BE: d83dde15 Decimal: 😕
😕
Category: So (Symbol, Other)
Bidi: ON (Other Neutrals)
$ perl -CA -le 'printf "%x\n", ord shift' 😕
1f615
\U1F615
eine andere gültige Hexadezimalzahl folgt, angenommen wird, dass diese Teil der Escape-Sequenz ist. Damit es funktioniert, unabhängig davon, worauf es folgt, muss es genügend führende Nullen haben, um genau acht Stellen lang zu sein:\U0001F615