Como traduzir caracteres Unicode? [duplicado]

2

Estou tentando converter alguns caracteres para a forma de largura total como esta

tr 'abcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz'

No entanto, isso não funciona. Fiz uma pesquisa e, ao que parece, tr não suporta UTF-8 . Então, com base na resposta sobre essa questão eu tentei usar perl

perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'

Mas ainda não ajuda. Eu tentei versões mais simples dele

$ echo abca | perl -C -pe 's/a/a/g'
ï½bcï½
$ echo abca | perl -C -pe 'tr/a/a/'
ïbcï

Parece que o perl ainda trata caracteres UTF-8 multibyte como bytes

Como posso converter esses caracteres corretamente?

    
por phuclv 11.03.2018 / 07:09

1 resposta

10

O GNU e o BSD sed são compatíveis com vários bytes em códigos de idioma apropriados e o y comando é análogo a tr :

$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
hello

Isso deve funcionar na maioria dos lugares em que você pode executá-lo, desde que sua localidade seja UTF-8.

O problema do Perl não é tão simples quanto tratar caracteres multibyte como bytes. Ele está entendendo bem sua entrada, e até mesmo codificando a saída, é o código-fonte que não entende:

$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'|hexdump -C
00000000  c3 af c2 bd c2 81 0a                              |.......|

A codificação UTF-8 de "a" é ef bd 81 , então você pode ver que ela está tratando "b" como o segundo byte e depois mutilando-o tentando codificá-lo na saída, e o mesmo para "c ". Você precisa use utf8 para ter sua própria fonte Perl (5) codificada dessa maneira ; -C controla apenas o IO que o programa faz quando está em execução.

Você pode colocar use utf8; na sua string -e ou usar -Mutf8 na linha de comando :

$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc

O Perl 6 resolve esta questão, como muitos, mas ...

    
por 11.03.2018 / 07:35