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.