Estou tentando converter alguns caracteres para o formulário de largura total como este
tr 'abcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz'
No entanto, isso não funciona. Eu fiz uma pesquisa e descobri tr
que não suporta UTF-8 . Então, com base na resposta dessa pergunta, tentei usar o perl
perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
Mas ainda sem 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 perl ainda trata caracteres UTF-8 multibyte como bytes
Como posso converter esses caracteres corretamente?
Tanto o GNU quanto o BSD
sed
reconhecem multibyte em localidades apropriadas, e oy
comando é análogo atr
:Isso deve funcionar na maioria dos lugares em que você provavelmente o executará, desde que sua localidade seja UTF-8.
A questão do Perl não é tão simples quanto tratar caracteres multibyte como bytes. Está entendendo bem sua entrada e, mesmo codificando a saída, é o código -fonte que não entende:
A codificação UTF-8 de "a" é
ef bd 81
, então você pode ver que está tratando "b" como aquele segundo byte e depois distorcendo-o tentando codificá-lo na saída, e o mesmo para "c". Você precisause utf8
ter sua própria fonte Perl (5) codificada dessa maneira ;-C
controla apenas IO que o programa faz quando está em execução.Você pode colocar
use utf8;
em sua-e
string ou usar-Mutf8
na linha de comando :O Perl 6 resolve esse problema, como muitos, mas...