coreutils qui connaissent utf?

16

Lorsque j'ai utilisé cutaujourd'hui, j'ai découvert qu'il ne traitait pas un caractère UTF-8 comme un caractère, mais 3 caractères car il faisait 3 octets de long.

Cela semble généralement vrai pour de nombreux outils.

Existe-t-il des versions de l' coreutilsUTF-8?

Ma localesortie:

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=

Voici quand cutça ne marche pas

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

La bonne sortie doit être

si cut -ctravaillé avec des caractères multi-octets.

Chao Xu
la source
Avez-vous bien réglé votre locale? Quelle est la lecture de l' localeinvocation de la commande (sans arguments)?
alex
J'ai mis à jour avec les paramètres régionaux.
Chao Xu
OK, pouvez-vous également ajouter un exemple de votre cutligne de commande?
alex
Peut confirmer cela sur Ubuntu 10.04 avec echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig
Ce qui est triste, c'est que, 3 ans plus tard, c'est toujours vrai dans Ubuntu 13.10 ...
Dr Mike

Réponses:

13

Les coreutils GNU comprennent UTF-8 en général. Par exemple, les echo 哈哈 | wc -msorties sont correctes 3dans un environnement local UTF-8 (notez que l'option est -m, pas -cqui pour des raisons historiques signifie octets).

Ceci est un bug dans cut. La recherche de la source decut , cutsur les caractères n'est tout simplement pas implémentée: l' -coption est traitée comme un synonyme de -b.

Une solution de contournement consiste à utiliser awk. GNU awk fait très bien face à UTF-8.

awk '{print substr($0,2,length)}'
Gilles 'SO- arrête d'être méchant'
la source
8
Il vaudrait la peine de déposer un rapport de bug (même s'il finit par être un doublon) pour ennuyer les responsables de coreutils à corriger des bugs comme celui-ci, plutôt que d'ajouter simplement des hacks stupides et des utilitaires de jouets dont personne n'a besoin ...
R .. GitHub STOP HELPING ICE
3

Cela ressemble à un bogue dans votre build / version de coreutils . Je peux le reproduire sur Ubuntu 10.10 Maverick Meerkat mais pas sur Fedora 15.

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

Si vous utilisez également Ubuntu, vous pouvez signaler un bogue aux conditionneurs Ubuntu coreutilsen exécutant la commande suivante:

apport-bug coreutils

Mise à jour: Gilles souligne dans les commentaires qu'il s'agit d'un bug dans la version amont de ce coreutilsque Fedora a corrigé. Vous pouvez trouver leur correctif ici si vous souhaitez essayer de le corriger vous-même pour le faire fonctionner.

Patchs
la source
Je viens de regarder la source, et c'est un bug en amont que Fedora a apparemment corrigé. La source en amont fait simplement -cun alias de -b.
Gilles 'SO- arrête d'être méchant'
@Gilles: Intéressant. J'ai lié le correctif de Fedora dans ma réponse au cas où quelqu'un voudrait essayer de le réparer par lui-même.
Patchs du
Le lien est rompu.
corvus_192