coreutils che sono consapevoli?


16

Quando l'ho usato cutoggi, ho scoperto che non tratta un personaggio UTF-8 come un personaggio, ma 3 caratteri perché è lungo 3 byte.

Questo sembra essere generalmente vero per molti strumenti.

Esistono versioni di coreutilsUTF-8 a conoscenza?

La mia localeuscita:

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=

Ecco quando cutnon funziona

echo 哈哈 | cut -c 2-
��哈

L'output giusto dovrebbe essere

se ha cut -cfunzionato con caratteri multibyte.


Hai impostato localecorrettamente? Qual è la lettura localedell'invocazione di comandi (senza argomenti)?
alex

Ho aggiornato con le impostazioni internazionali.
Chao Xu,

OK, puoi anche aggiungere qualche esempio della tua cutriga di comando?
alex

Posso confermarlo su Ubuntu 10.04 con echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig il

La cosa triste è che, 3 anni dopo, questo è ancora vero in Ubuntu 13.10 ...
Dr. Mike

Risposte:


13

I coreutils GNU comprendono UTF-8 in generale. Ad esempio, l' echo 哈哈 | wc -moutput corretto 3in una locale UTF-8 (si noti che l'opzione è -m, non -cche per motivi storici significa byte).

Questo è un bug in cut. Guardando la fonte dicut , cutsui personaggi semplicemente non è implementato: l' -copzione è considerata un sinonimo di -b.

Una soluzione alternativa consiste nell'utilizzare awk. GNU Awk si comporta bene con UTF-8.

awk '{print substr($0,2,length)}'

8
Vale la pena presentare un bugreport (anche se finisce per essere un duplicato) per infastidire i manutentori di coreutils nel risolvere bug come questo, piuttosto che aggiungere semplicemente stupidi hack e utility giocattolo che nessuno ha bisogno ...
R .. GitHub STOP HELPING ICE

3

Sembra un bug nella tua build / versione di coreutils. Posso riprodurlo su Ubuntu 10.10 Maverick Meerkat ma non su Fedora 15.

[patches @ holocene ~] $ cat / etc / fedora-release 
Fedora versione 15 (Lovelock)
[patches @ holocene ~] $ rpm -q coreutils
coreutils-8.10-2.fc15.x86_64
[patches @ holocene ~] $ echo 哈哈 | taglio -c 2-
哈
[patches @ holocene ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holocene: / # dpkg-query -s coreutils | Versione grep
Versione: 8.5-1ubuntu3
root @ holocene: / # echo 哈哈 | taglio -c 2-
哈

Se usi anche Ubuntu, puoi segnalare un bug ai coreutilspackager Ubuntu eseguendo il comando seguente:

apport-bug coreutils

Aggiornamento: Gilles sottolinea nei commenti che questo è un bug nella versione upstream di coreutilsquella che Fedora ha corretto. Puoi trovare la loro patch qui se vuoi provare a patchare tu stesso per farlo funzionare.


Ho appena guardato la fonte, ed è un bug a monte che Fedora apparentemente ha corretto. La sorgente upstream crea semplicemente -cun alias di -b.
Gilles 'SO- smetti di essere malvagio' il

@Gilles: interessante. Mi sono collegato alla patch di Fedora nella mia risposta nel caso in cui qualcuno volesse provare a risolverlo da solo.
Patch

Il collegamento è interrotto.
corvus_192,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.