coreutils, которые знают?

16

Когда я использовал cutсегодня, я обнаружил, что это не символ UTF-8 как символ, а 3 символа, потому что его длина составляет 3 байта.

Похоже, что это в целом верно для многих инструментов.

Существуют ли версии с поддержкой coreutilsUTF-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командной строки?
Алекс
Можно подтвердить это в Ubuntu 10.04 с помощью echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig
Печально то, что спустя 3 года это все еще верно в Ubuntu 13.10 ...
Доктор Майк

Ответы:

13

GNU coreutils понимает UTF-8 в целом. Например, echo 哈哈 | wc -mправильно выводит данные 3в локали UTF-8 (обратите внимание, что опция есть -m, а не то, -cчто по историческим причинам означает байты).

Это ошибка в cut. Глядя на источникcut , cutдля символов просто не реализовано: -cопция рассматривается как синоним -b.

Обходной путь должен использовать awk. GNU awk отлично справляется с UTF-8.

awk '{print substr($0,2,length)}'
Жиль "ТАК - перестань быть злым"
источник
8
Было бы целесообразно подать отчет об ошибке (даже если он окажется дубликатом), чтобы раздражать сопровождающих coreutils фактически исправлять подобные ошибки, а не просто добавлять глупые хаки и игрушечные утилиты, которые никому не нужны ...
R .. GitHub STOP ПОМОЩЬ ЛЬДУ
3

Это похоже на ошибку в вашей сборке / версии coreutils. Я могу воспроизвести это на Ubuntu 10.10 Maverick Meerkat, но не на Fedora 15.

[patches @ holocene ~] $ cat / etc / fedora-release 
Fedora релиз 15 (Лавлок)
[patches @ holocene ~] $ rpm -q coreutils
Coreutils-8.10-2.fc15.x86_64
[патчи @ голоцена ~] $ echo 哈哈 | cut -c 2-
哈
[патчи @ голоцена ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holocene: / # dpkg-query -s coreutils | версия grep
Версия: 8.5-1ubuntu3
root @ holocene: / # echo 哈哈 | cut -c 2-
哈

Если вы также используете Ubuntu, вы можете сообщить об ошибке coreutilsупаковщикам Ubuntu , выполнив следующую команду:

apport-bug coreutils

Обновление: Жиль указывает в комментариях, что это ошибка в исходной версии, coreutilsкоторую исправила Fedora. Вы можете найти их патч здесь, если хотите попробовать сами, чтобы заставить его работать.

Патчи
источник
Я только что посмотрел на источник, и это ошибка верхнего уровня, которую Fedora явно исправила. Исходный источник просто создает -cпсевдоним -b.
Жиль "ТАК - перестань быть злым"
@ Жиль: Интересно. Я связался с патчем Fedora в своем ответе на случай, если кто-то захочет попробовать и исправить это для себя.
патчи
Ссылка не работает.
corvus_192