coreutils qui sont au courant?

Quand j'ai utilisé cut aujourd'hui, j'ai découvert qu'il ne traitait pas un caractère UTF-8 en tant que personnage, mais 3 caractères car il a 3 octets de long.

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

Y a-t-il des versions des coreutils qui sont au courant de l'UTF-8?

Ma sortie 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= 

Voici quand la cut ne fonctionne pas

 echo 哈哈 | cut -c 2-   哈 

Le bon résultat devrait être

  

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

Les coreutils GNU include l'UTF-8 en général. Par exemple echo 哈哈 | wc -m echo 哈哈 | wc -m correctement 3 dans un environnement local UTF-8 (notez que l'option est -m , pas -c ce qui pour des raisons historiques signifie des octets).

C'est un bug dans la cut . En regardant la source de la cut , les caractères cut sont tout simplement pas implémentés: l'option -c est traitée comme un synonyme de -b .

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

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

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

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

Si vous utilisez également Ubuntu, vous pouvez signaler un bogue aux packagers d'Ubuntu coreutils en exécutant la command suivante:

 apport-bug coreutils 

Mise à jour: Gilles souligne dans les commentaires qu'il s'agit d'un bogue dans la version amont de coreutils que Fedora a patché. Vous pouvez find leur patch ici si vous souhaitez essayer de le patcher vous-même pour le faire fonctionner.