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
Hier ist eine Möglichkeit, von UTF-32 (Big Endian) nach UTF-8 zu konvertieren
Sie werden dort Ihren Hex-Wert bemerken
0x01F615
, der mit einer zusĂ€tzlichen fĂŒhrenden 0 aufgefĂŒllt ist, um 32 Bits zu fĂŒllen.Die Wikipedia-Seite zu UTF-8 erklĂ€rt die Umwandlung von einem Unicode-Codepunkt in seine UTF-8-Darstellung sehr deutlich. Es ist jedoch möglicherweise nicht die beste Idee, es in Shell-Skripten selbst zu tun.
UTF-32 hat eine feste Breite und die Entsprechung zwischen Codepoint und UTF-32-Darstellung ist trivial - der Wert ist der gleiche.
quelle
Schöne Art und Weise, es in deinem Kopf oder auf Papier zu tun:
Stellen Sie fest, wie viele Bytes es sein werden: Werte unter U + 0080 sind ein Byte, andere unter U + 0800 sind 2 Bytes, andere unter U + 10000 sind 3 Bytes, andere 4 Bytes. In Ihrem Fall 4 Bytes.
Konvertieren hex zu Oktal:
0373025
.Ab Ende, abschÀlen 2 Oktalziffern zu einer Zeit , eine Folge von Oktalwerte zu erhalten:
037
030
025
.Wenn Sie weniger Oktalwerte als die erwartete Anzahl von Bytes haben, eine zusĂ€tzliche 0 am Anfang hinzufĂŒgen:
000
037
030
025
.FĂŒr alle , aber die erste, fĂŒgen Sie auf
0200
bekommen:000
0237
0230
0225
.Zum ersten, hinzufĂŒgen ,
0300
wenn die erwarteten LĂ€nge 2 ist,0340
wenn es 3 ist, oder0360
wenn es 4 ist, zu erhalten:360
0237
0230
0225
.Schreiben Sie jetzt als eine Reihe von Oktal entkommt:
\360\237\230\225
. Wenn Sie möchten, können Sie auch zurĂŒck in Hex konvertieren.quelle