coreutils, którzy są świadomi utf?

16

Kiedy używałem cutdzisiaj, dowiedziałem się, że nie traktuje znaku UTF-8 jako znaku, ale 3 znaki, ponieważ ma 3 bajty długości.

Wydaje się to być ogólnie prawdą w przypadku wielu narzędzi.

Czy istnieją wersje, coreutilsktóre obsługują UTF-8?

Moja localeprodukcja:

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=

Oto kiedy cutnie działa

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

Właściwe wyjście powinno być

jeśli cut -cpracował ze znakami wielobajtowymi.

Chao Xu
źródło
Czy ustawiłeś localepoprawnie? Jaka jest interpretacja localewywołania komendy (bez argumentów)?
alex
Zaktualizowałem ustawienia regionalne.
Chao Xu,
OK, czy możesz również dodać przykład swojego cutwiersza poleceń?
alex
Potwierdza to na Ubuntu 10.04 za pomocą echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig
Smutne jest to, że 3 lata później jest to nadal prawdą w Ubuntu 13.10 ...
Dr Mike

Odpowiedzi:

13

Coreutils GNU ogólnie rozumieją UTF-8. Na przykład echo 哈哈 | wc -mpoprawnie wyprowadza dane 3w ustawieniach regionalnych UTF-8 (należy pamiętać, że opcja jest inna -m, a nie -cz powodów historycznych oznacza bajty).

To jest błąd w cut. Patrząc na źródłocut , cutna znaki nie jest po prostu realizowane: the -copcja jest traktowane jako synonim -b.

Obejściem tego problemu jest użycie awk. GNU awk radzi sobie dobrze z UTF-8.

awk '{print substr($0,2,length)}'
Gilles „SO- przestań być zły”
źródło
8
Warto zgłosić raport o błędzie (nawet jeśli ostatecznie będzie duplikatem), aby zirytować opiekunów Coreutils tak naprawdę naprawianiem takich błędów, a nie tylko dodawanie głupich hacków i narzędzi zabawkowych, których nikt nie potrzebuje ...
R .. GitHub STOP HELPING ICE
3

To wygląda na błąd w twojej kompilacji / wersji coreutils. Mogę to odtworzyć na Ubuntu 10.10 Maverick Meerkat, ale nie na Fedorze 15.

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

Jeśli używasz również Ubuntu, możesz zgłosić błąd do programów coreutilspakujących Ubuntu , uruchamiając następujące polecenie:

apport-bug coreutils

Aktualizacja: Gilles wskazuje w komentarzach, że jest to błąd w łatanej wcześniej wersji coreutilsFedory. Możesz znaleźć ich łatkę tutaj, jeśli chcesz spróbować ją załatać, aby działała.

Łatki
źródło
Właśnie spojrzałem na źródło i jest to błąd, który Fedora najwyraźniej załatała. Źródło nadrzędne po prostu tworzy -calias -b.
Gilles 'SO - przestań być zły'
@Gilles: Ciekawe. W swojej odpowiedzi podłączyłem łatkę Fedory na wypadek, gdyby ktoś chciał spróbować ją naprawić samodzielnie.
Łaty
Link jest zepsuty.
corvus_192