Когда я использовал cut
сегодня, я обнаружил, что это не символ UTF-8 как символ, а 3 символа, потому что его длина составляет 3 байта.
Похоже, что это в целом верно для многих инструментов.
Существуют ли версии с поддержкой coreutils
UTF-8?
Мой locale
вывод:
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=
Вот когда cut
не работает
echo 哈哈 | cut -c 2-
��哈
Правильный вывод должен быть
哈
если cut -c
работал с многобайтовыми символами.
locale
правильно настроили ? Что такое чтениеlocale
(без аргументов) вызова команды?cut
командной строки?echo ßßßß | cut -c 2-
->�ßßß
(LANG=en_US.UTF-8
)Ответы:
GNU coreutils понимает UTF-8 в целом. Например,
echo 哈哈 | wc -m
правильно выводит данные3
в локали UTF-8 (обратите внимание, что опция есть-m
, а не то,-c
что по историческим причинам означает байты).Это ошибка в
cut
. Глядя на источникcut
,cut
для символов просто не реализовано:-c
опция рассматривается как синоним-b
.Обходной путь должен использовать awk. GNU awk отлично справляется с UTF-8.
источник
Это похоже на ошибку в вашей сборке / версии
coreutils
. Я могу воспроизвести это на Ubuntu 10.10 Maverick Meerkat, но не на Fedora 15.Если вы также используете Ubuntu, вы можете сообщить об ошибке
coreutils
упаковщикам Ubuntu , выполнив следующую команду:Обновление: Жиль указывает в комментариях, что это ошибка в исходной версии,
coreutils
которую исправила Fedora. Вы можете найти их патч здесь, если хотите попробовать сами, чтобы заставить его работать.источник
-c
псевдоним-b
.