Coreutils, die utf bewusst sind?

16

Als ich cutheute 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 coreutilsUTF-8?

Meine localeAusgabe:

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 cutnicht funktioniert

echo 哈哈 | cut -c 2-
��哈

Die richtige Ausgabe sollte sein

wenn cut -cmit Multibyte-Zeichen gearbeitet.

Chao Xu
quelle
Hast du deine localerichtig eingestellt? Wie lautet die Lesart des localeBefehlsaufrufs (ohne Argumente)?
Alex
Ich habe mit dem Gebietsschema aktualisiert.
Chao Xu
OK, können Sie auch ein Beispiel für Ihre cutBefehlszeile hinzufügen ?
Alex
Kann dies auf Ubuntu 10.04 mit echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig
Das Traurige ist, dass dies auch 3 Jahre später in Ubuntu 13.10 noch zutrifft ...
Dr. Mike

Antworten:

13

GNU-Coreutils verstehen UTF-8 im Allgemeinen. Zum Beispiel echo 哈哈 | wc -mgibt korrekt 3in einer UTF-8 locale (Beachten Sie, dass die Option -m, nicht -cdie aus historischen Gründen Mitteln Bytes).

Dies ist ein Fehler in cut. Das Betrachten der Quelle voncut , cutauf Zeichen ist einfach nicht implementiert: Die -cOption wird als Synonym von behandelt -b.

Eine Problemumgehung besteht darin, awk zu verwenden. GNU awk kommt mit UTF-8 zurecht.

awk '{print substr($0,2,length)}'
Gilles 'SO - hör auf böse zu sein'
quelle
8
Es lohnt sich, einen Bugreport einzureichen (auch wenn es sich um ein Duplikat handelt), um die Coreutils-Betreuer zu verärgern, solche Bugs tatsächlich zu beheben, anstatt nur dumme Hacks und Spielzeug-Utilities hinzuzufügen, die niemand braucht ...
R ..
3

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.

[patches @ holocene ~] $ cat / etc / fedora-release 
Fedora Release 15 (Lovelock)
[patches @ holocene ~] $ rpm -q coreutils
coreutils-8.10-2.fc15.x86_64
[patches @ holocene ~] $ echo 哈哈 | Schnitt -c 2-
哈
[patches @ holocene ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holocene: / # dpkg-query -s coreutils | grep Version
Version: 8.5-1ubuntu3
root @ holocene: / # echo 哈哈 | Schnitt -c 2-

Wenn Sie auch Ubuntu verwenden, können Sie den Ubuntu- coreutilsPackagern einen Fehler melden, indem Sie den folgenden Befehl ausführen:

apport-bug coreutils

Update: Gilles weist in den Kommentaren darauf hin, dass dies ein Fehler in der Upstream-Version von coreutilsFedora ist. Sie können ihren Patch hier finden, wenn Sie versuchen möchten, ihn selbst zu patchen, damit er funktioniert.

Aufnäher
quelle
Ich habe mir nur die Quelle angesehen und es handelt sich um einen Upstream-Fehler, den Fedora anscheinend behoben hat. Die vorgelagerte Quelle macht einfach -ceinen Alias ​​aus -b.
Gilles 'SO- hör auf böse zu sein'
@ Gilles: Interessant. Ich habe in meiner Antwort auf Fedoras Patch verwiesen, falls jemand versuchen möchte, das Problem selbst zu beheben.
Patches
Verbindung ist unterbrochen.
corvus_192