Kiedy używałem cut
dzisiaj, 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, coreutils
które obsługują UTF-8?
Moja locale
produkcja:
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 cut
nie działa
echo 哈哈 | cut -c 2-
��哈
Właściwe wyjście powinno być
哈
jeśli cut -c
pracował ze znakami wielobajtowymi.
locale
poprawnie? Jaka jest interpretacjalocale
wywołania komendy (bez argumentów)?cut
wiersza poleceń?echo ßßßß | cut -c 2-
->�ßßß
(LANG=en_US.UTF-8
)Odpowiedzi:
Coreutils GNU ogólnie rozumieją UTF-8. Na przykład
echo 哈哈 | wc -m
poprawnie wyprowadza dane3
w ustawieniach regionalnych UTF-8 (należy pamiętać, że opcja jest inna-m
, a nie-c
z powodów historycznych oznacza bajty).To jest błąd w
cut
. Patrząc na źródłocut
,cut
na znaki nie jest po prostu realizowane: the-c
opcja jest traktowane jako synonim-b
.Obejściem tego problemu jest użycie awk. GNU awk radzi sobie dobrze z UTF-8.
źródło
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.Jeśli używasz również Ubuntu, możesz zgłosić błąd do programów
coreutils
pakujących Ubuntu , uruchamiając następujące polecenie:Aktualizacja: Gilles wskazuje w komentarzach, że jest to błąd w łatanej wcześniej wersji
coreutils
Fedory. Możesz znaleźć ich łatkę tutaj, jeśli chcesz spróbować ją załatać, aby działała.źródło
-c
alias-b
.