coreutils que estão cientes?

16

Quando usei cuthoje, descobri que ele não trata um caractere UTF-8 como um caractere, mas três caracteres por ter 3 bytes de comprimento.

Isso geralmente parece verdadeiro para muitas ferramentas.

Existem versões coreutilscompatíveis com UTF-8?

Minha localesaída:

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 cutnão funciona

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

A saída correta deve ser

se cut -ctrabalhado com caracteres multibyte.

Chao Xu
fonte
Você definiu o seu localecorretamente? Qual é a leitura da localeinvocação de comando (sem argumentos)?
alex
Eu atualizei com o código do idioma.
Chao Xu
OK, você também pode adicionar algum exemplo da sua cutlinha de comando?
alex
Pode confirmar isso no Ubuntu 10.04 com echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig
O triste é que, 3 anos depois, isso ainda é verdade no Ubuntu 13.10 ...
Dr. Mike

Respostas:

13

Os coreutils do GNU entendem o UTF-8 em geral. Por exemplo, echo 哈哈 | wc -mgera corretamente 3em um código de idioma UTF-8 (observe que a opção é -m, e não -cpor motivos históricos significa bytes).

Este é um erro cut. Observar a origem doscutcut caracteres , on simplesmente não é implementado: a -copção é tratada como sinônimo de -b.

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

awk '{print substr($0,2,length)}'
Gilles 'SO- parar de ser mau'
fonte
8
Valeria a pena arquivar um relatório de erros (mesmo que acabe sendo uma duplicata) para irritar os mantenedores do coreutils na correção de erros como esse, em vez de apenas adicionar hacks estúpidos e utilitários de brinquedos que ninguém precisa ...
R .. GitHub STOP HELPING ICE
3

Isso parece um bug na sua versão / compilação do coreutils. Posso reproduzir isso no Ubuntu 10.10 Maverick Meerkat, mas não no Fedora 15.

[patches @ holocene ~] $ cat / etc / fedora-release 
Fedora versão 15 (Lovelock)
[patches @ holoceno ~] $ rpm -q coreutils
coreutils-8.10-2.fc15.x86_64
[patches @ holoceno ~] $ eco 哈哈 | cut -c 2-
哈
[patches @ holocene ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holoceno: / # dpkg-query -s coreutils | Versão grep
Versão: 8.5-1ubuntu3
root @ holoceno: / # eco 哈哈 | cut -c 2-
哈

Se você também estiver usando o Ubuntu, poderá relatar um erro aos coreutilsempacotadores do Ubuntu executando o seguinte comando:

apport-bug coreutils

Atualização: Gilles aponta nos comentários que este é um bug na versão upstream do coreutilspatch do Fedora. Você pode encontrar o patch deles aqui se quiser tentar fazer o patch para fazê-lo funcionar.

Patches
fonte
Eu apenas olhei para a fonte e é um bug que o Fedora aparentemente corrigiu. A fonte upstream simplesmente cria -cum alias de -b.
Gilles 'SO- stop be evil'
@ Gilles: Interessante. Eu vinculei ao patch do Fedora na minha resposta, caso alguém queira tentar consertá-lo por conta própria.
Patches
Link quebrado.
Corvus_192