coreutils, які є абсолютно відомими?


16

Коли я використовував 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командного рядка?
alex

Можна підтвердити це на Ubuntu 10.04 за допомогою echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig

Сумно в тому, що через 3 роки це все ще вірно в Ubuntu 13.10 ...
Доктор Майк

Відповіді:


13

Основні програми GNU взагалі розуміють 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
Варто було б подати bugreport (навіть якщо це в кінцевому підсумку є дублікатом), щоб дратувати сервісних службовців Coreutils фактично виправляти подібні помилки, а не просто додавати дурні хакі та утиліти для іграшок, які нікому не потрібні ...
R .. GitHub STOP ДОПОМОГА ДЛЯ

3

Це схоже на помилку у вашій збірці / версії coreutils. Я можу відтворити це на Ubuntu 10.10 Maverick Meerkat, але не на Fedora 15.

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

Якщо ви також використовуєте Ubuntu, ви можете повідомити про помилку coreutilsпакетам Ubuntu, виконавши таку команду:

apport-bug coreutils

Оновлення: Жилль в коментарях вказує, що це помилка у версії за течією, coreutilsяку виправили Fedora. Ви можете знайти їх патч тут, якщо ви хочете спробувати зафіксувати його самостійно, щоб він працював.


Я просто подивився на джерело, і Fedora, очевидно, виправляв помилку. Вихідне джерело просто робить -cпсевдонім -b.
Жиль "ТАК - перестань бути злим"

@Gilles: Цікаво. Я відповів на патч Fedora у своїй відповіді, якщо хтось захоче спробувати виправити це для себе.
Патчі

Посилання розірвано.
corvus_192
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.