Lorsque j'ai utilisé cut
aujourd'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' coreutils
UTF-8?
Ma locale
sortie:
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 -c
travaillé avec des caractères multi-octets.
locale
? Quelle est la lecture de l'locale
invocation de la commande (sans arguments)?cut
ligne de commande?echo ßßßß | cut -c 2-
->�ßßß
(LANG=en_US.UTF-8
)Réponses:
Les coreutils GNU comprennent UTF-8 en général. Par exemple, les
echo 哈哈 | wc -m
sorties sont correctes3
dans un environnement local UTF-8 (notez que l'option est-m
, pas-c
qui pour des raisons historiques signifie octets).Ceci est un bug dans
cut
. La recherche de la source decut
,cut
sur les caractères n'est tout simplement pas implémentée: l'-c
option est traitée comme un synonyme de-b
.Une solution de contournement consiste à utiliser awk. GNU awk fait très bien face à UTF-8.
la source
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.Si vous utilisez également Ubuntu, vous pouvez signaler un bogue aux conditionneurs Ubuntu
coreutils
en exécutant la commande suivante:Mise à jour: Gilles souligne dans les commentaires qu'il s'agit d'un bug dans la version amont de ce
coreutils
que Fedora a corrigé. Vous pouvez trouver leur correctif ici si vous souhaitez essayer de le corriger vous-même pour le faire fonctionner.la source
-c
un alias de-b
.