Quando usei cut
hoje, 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 coreutils
compatíveis com UTF-8?
Minha locale
saí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 cut
não funciona
echo 哈哈 | cut -c 2-
��哈
A saída correta deve ser
哈
se cut -c
trabalhado com caracteres multibyte.
locale
corretamente? Qual é a leitura dalocale
invocação de comando (sem argumentos)?cut
linha de comando?echo ßßßß | cut -c 2-
->�ßßß
(LANG=en_US.UTF-8
)Respostas:
Os coreutils do GNU entendem o UTF-8 em geral. Por exemplo,
echo 哈哈 | wc -m
gera corretamente3
em um código de idioma UTF-8 (observe que a opção é-m
, e não-c
por motivos históricos significa bytes).Este é um erro
cut
. Observar a origem doscut
cut
caracteres , on simplesmente não é implementado: a-c
opção é tratada como sinônimo de-b
.Uma solução alternativa é usar o awk. O GNU awk lida com UTF-8 muito bem.
fonte
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.Se você também estiver usando o Ubuntu, poderá relatar um erro aos
coreutils
empacotadores do Ubuntu executando o seguinte comando:Atualização: Gilles aponta nos comentários que este é um bug na versão upstream do
coreutils
patch do Fedora. Você pode encontrar o patch deles aqui se quiser tentar fazer o patch para fazê-lo funcionar.fonte
-c
um alias de-b
.