coreutils que estão cientes?

16

Quando usei cut hoje, descobri que ele não trata um caractere UTF-8 como um caractere, mas sim 3 caracteres porque ele tem 3 bytes.

Isso parece ser geralmente verdadeiro para muitas ferramentas.

Existem versões do coreutils que são compatíveis com o UTF-8?

Minha locale output:

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=

Aqui é quando cut não funciona

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

A saída certa deve ser

se cut -c trabalhou com caracteres multibyte.

    
por Chao Xu 01.07.2011 / 23:45

2 respostas

13

GNU coreutils entendem UTF-8 em geral. Por exemplo, echo 哈哈 | wc -m corretamente gera 3 em uma localidade UTF-8 (observe que a opção é -m , não -c , o que, por razões históricas, significa bytes).

Este é um bug em cut . Olhando para a fonte de cut , cut em caracteres simplesmente não está implementado: a opção -c é tratada como sinônimo de -b .

Uma solução alternativa é usar o awk. O GNU awk lida bem com o UTF-8.

awk '{print substr($0,2,length)}'
    
por 02.07.2011 / 12:42
3

Isso parece um bug em sua compilação / versão de coreutils . Eu posso reproduzir isso no Ubuntu 10.10 Maverick Meerkat, mas não no Fedora 15.

[patches@holocene ~]$ cat /etc/fedora-release 
Fedora release 15 (Lovelock)
[patches@holocene ~]$ rpm -q coreutils
coreutils-8.10-2.fc15.x86_64
[patches@holocene ~]$ echo 哈哈 | cut -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 | grep Version
Version: 8.5-1ubuntu3
root@holocene:/# echo 哈哈 | cut -c 2-
��哈

Se você também estiver usando o Ubuntu, você pode relatar um bug para o Ubuntu coreutils packagers executando o seguinte comando:

apport-bug coreutils

Atualização: Gilles aponta nos comentários que este é um bug na versão upstream de coreutils que o Fedora corrigiu. Você pode encontrar o seu patch aqui se você quiser tentar consertá-lo para que funcione.

    
por 02.07.2011 / 12:35