Als ich cut
heute verwendete, stellte ich fest, dass es ein UTF-8-Zeichen nicht als Zeichen behandelt, sondern 3 Zeichen, weil es 3 Byte lang ist.
Dies scheint im Allgemeinen für viele Werkzeuge zu gelten.
Gibt es Versionen von coreutils
UTF-8?
Meine locale
Ausgabe:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Hier ist, wenn cut
nicht funktioniert
echo 哈哈 | cut -c 2-
��哈
Die richtige Ausgabe sollte sein
哈
wenn cut -c
mit Multibyte-Zeichen gearbeitet.
locale
richtig eingestellt? Wie lautet die Lesart deslocale
Befehlsaufrufs (ohne Argumente)?cut
Befehlszeile hinzufügen ?echo ßßßß | cut -c 2-
->�ßßß
(LANG=en_US.UTF-8
)Antworten:
GNU-Coreutils verstehen UTF-8 im Allgemeinen. Zum Beispiel
echo 哈哈 | wc -m
gibt korrekt3
in einer UTF-8 locale (Beachten Sie, dass die Option-m
, nicht-c
die aus historischen Gründen Mitteln Bytes).Dies ist ein Fehler in
cut
. Das Betrachten der Quelle voncut
,cut
auf Zeichen ist einfach nicht implementiert: Die-c
Option wird als Synonym von behandelt-b
.Eine Problemumgehung besteht darin, awk zu verwenden. GNU awk kommt mit UTF-8 zurecht.
quelle
Dies sieht aus wie ein Fehler in Ihrem Build / Ihrer Version von
coreutils
. Ich kann dies auf Ubuntu 10.10 Maverick Meerkat reproduzieren, aber nicht auf Fedora 15.Wenn Sie auch Ubuntu verwenden, können Sie den Ubuntu-
coreutils
Packagern einen Fehler melden, indem Sie den folgenden Befehl ausführen:Update: Gilles weist in den Kommentaren darauf hin, dass dies ein Fehler in der Upstream-Version von
coreutils
Fedora ist. Sie können ihren Patch hier finden, wenn Sie versuchen möchten, ihn selbst zu patchen, damit er funktioniert.quelle
-c
einen Alias aus-b
.