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.