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.


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)}'

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.