Como usar o comando fmt com caracteres não latinos?

3

Eu preciso usar fmt para formatar alguma saída de texto em grego, mas ela não se comporta como em caracteres latinos. Considere, por exemplo, as frases com 15 caracteres abaixo.

Com caracteres latinos:

 $echo "Have a nice day" | fmt -w 16
 Have a nice day

mas, estranhamente, com caracteres não latinos:

 $echo "Ηαωε α νιψε δαυ" | fmt -w 16
 Ηαωε α
 νιψε δαυ

Na verdade, para a string acima, o menor valor que ela imprime na frase sem quebras de linha seria -w 28 :

 $echo "Ηαωε α νιψε δαυ" | fmt -w 28
 Ηαωε α νιψε δαυ
 $echo "Ηαωε α νιψε δαυ" | fmt -w 27
 Ηαωε α νιψε
 δαυ

Alguém pode explicar por que isso acontece e como consertá-lo, se possível?

    
por geo909 17.01.2016 / 15:41

3 respostas

4

Para responder à sua pergunta, não está funcionando porque os caracteres gregos não são latinos, são caracteres Unicode e:

Unlike par, fmt has no Unicode support, ...

link

Notas adicionais

A segunda parte da sua pergunta sobre como, infelizmente,

Embora pareça haver um relatório técnico relativamente recente sobre como envolver Unicode, por exemplo, Heninger, Algoritmo de quebra de linha Unicode, 2015-06-01 link no entanto, isso parece ser apenas especificação, nenhuma implementação real ou menção de exemplos de instruções de software. Você poderia tentar perguntar ao autor pelo e-mail listado.

Como o artigo da Wikipedia sobre fmt se referia a par e estava disponível via apt-get , decidi experimentá-lo em seu texto postado.

Mas eu não tive sucesso, ele ainda não está como você deseja:

$ echo "Ηαωε α νιψε δαυ" | par 16gr
Ηαωε α
νιψε δαυ

A página man foi difícil o suficiente para que até mesmo o autor avisasse que era: not well-written for the end-user , mas se você está determinado, tente a sorte lendo-a.

    
por 17.01.2016 / 16:57
4

fmt , como tal, geralmente não suporta "não-latim" (no seu exemplo, provavelmente UTF-8). Você poderia usar par , o que faz isso.

Curiosamente, as páginas de manual do Solaris e do FreeBSD para fmt são muito semelhantes, sugerindo que o programa foi melhorado notadamente desde meados da década de 1980:

par pode estar disponível como um pacote para o seu sistema. Se não, é fácil compilar e encontrar aqui:

link

Por outro lado, o suporte adequado para UTF-8 em par está faltando:

por 17.01.2016 / 17:04
0

Os utilitários do Plan 9 geralmente são compatíveis com UTF-8. Você pode obtê-los em sua máquina unix instalando plan9port . No macOS você pode usar o Homebrew

brew install plan9port

que instala seus fmt sob o comando 9 . Parece se comportar do jeito que você queria:

$ echo "Ηαωε α νιψε δαυ" | 9 fmt -w 16
Ηαωε α νιψε δαυ
$ echo "Ηαωε α νιψε δαυ" | 9 fmt -w 14
Ηαωε α νιψε
δαυ
    
por 19.07.2018 / 09:24