UTF-8ist 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 \x15wäre UCS-4BEoder UTF-32BEKodierung.
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 printfDienstprogramm (im Gegensatz zu dem printfNutzen des GNU - Shell), geholt echo/ printf/ $'...'builtins ersten von zsh2003 , ksh93 2004 bash im Jahr 2010 (wenn auch nicht richtig dort arbeitet bis 2014 ), wurde aber offensichtlich von anderen Sprachen inspiriert.
ksh93unterstützt es auch als printf '\x1f615\n'und printf '\u{1f615}\n'.
$'\uXXXX'und $'\UXXXXXXXX'werden unterstützt von zsh, bash, ksh93, mkshund FreeBSD sh, GNU printf, GNU echo.
Einige erfordern alle Ziffern (im \U0001F615Gegensatz 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 \UXXXXXXXXdurch hexadezimale Ziffern wie in gefolgt werden soll \U0001F615FOX, wie es \U1F615FOXgewesen 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_ALLzugeordnet 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
\U1F615eine 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