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.


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.