Substituir caracteres unicode compostos

0

Eu tenho um arquivo com caracteres unicode pré-compostos. Aqui está a página da Wikipedia sobre isso. Eu tenho uma palavra como "Åström", mas os acentos não estão no alfabeto desta língua. Eu quero me livrar deles, mas não sei como - eu tentei copiar e colar os personagens (trabalhei para alguns antes - provavelmente eles não foram compostos), mas isso não dá o resultado esperado.

    
por MatthewRock 11.02.2016 / 11:48

3 respostas

1

Seu Åström tem decompostos caracteres unicode, não pré-compostos uns:

(Estou assumindo que a localidade atual usa UTF-8 e os caracteres digitados na linha de comando usam a codificação UTF-8 aqui (copiei-os em um navegador usando UTF-8)).

$ printf %s Åström | uconv -x any-name
\N{LATIN CAPITAL LETTER A}\N{COMBINING RING ABOVE}\N{LATIN SMALL LETTER S}\N{LATIN SMALL LETTER T}\N{LATIN SMALL LETTER R}\N{LATIN SMALL LETTER O}\N{COMBINING DIAERESIS}\N{LATIN SMALL LETTER M}

Observe o Combinação de diacríticos acima . Os pré-compostos seriam:

$ printf %s Åström | uconv -x nfkc | uconv -x any-name
\N{LATIN CAPITAL LETTER A WITH RING ABOVE}\N{LATIN SMALL LETTER S}\N{LATIN SMALL LETTER T}\N{LATIN SMALL LETTER R}\N{LATIN SMALL LETTER O WITH DIAERESIS}\N{LATIN SMALL LETTER M}

Esses caracteres pré-compostos, ao contrário dos acentos combinados, estão presentes em iso8859-1 ou iso8859-15. Então, se esse é o conjunto de caracteres de destino desejado, você poderia fazer:

$ printf %s Åström | uconv -x nfkc -t iso-8859-1

Para converter os caracteres que podem ser convertidos, aproxime os outros:

$ printf %s 'Åström й' | uconv -x nfkc | iconv -t iso-8859-5//TRANSLIT
Astrom <0xd9>

(© está no charset iso-8859-5, portanto é convertido para sua representação lá (0xd9 byte), mas não Å, ou ö que são então convertidos para uma A e o de aproximação). / p>

Se você quer dizer que sua entrada tem uma combinação de caracteres decompostos (como e ) e pré-compostos (como й ) e você deseja manter os pré-compostos, mas descartar a combinação caracteres nos decompostos, então você pode fazer:

$ printf %s 'Åström й' | uconv -x '[:Nonspacing Mark:]>'
Astrom й

Observe que há dois caracteres em Unicode com uma representação visual Å : U + 212B (Ångström) e U + 00C5 (A com anel acima). nfkc converterá U + 212B para U + 00C5.

Se você quiser remover todos os sinais diacríticos, tente:

$ printf %s Åström | iconv -t us//TRANSLIT
Astrom

(lembre-se de que algumas implementações de iconv podem aproximar os acentos com caracteres " ou ' ... adjacentes)

Ou:

$ printf %s Åström | uconv -x nfd -c -t us
Astrom

(decompõe, converte em ASCII, soltando caracteres que não podem ser convertidos como combinações de acentos).

Ou:

$ printf %s Åström | uconv -x "::nfd;[:Nonspacing Mark:]>;"
Astrom

(decompõe, solte todas as marcas de espaçamento)

Ou:

$ printf %s Åström | uconv -x Latin-ASCII
Astrom

(transliteração ASCII para caracteres na escrita latina).

uconv é um utilitário do Projeto da UTI . No Debian e derivados, você o encontra no pacote icu-devtools .

    
por 11.02.2016 / 12:12
1

Existe um módulo Perl Text :: Unaccent disponível no CPAN para o seu propósito:

link

Um exemplo de script perl (trabalhando de STDIN para STDOUT) pode parecer com:

#!/usr/bin/perl
use Text::Unaccent;
while ($zeile = <STDIN>)
{
   print STDOUT unac_string("UTF-8", $zeile);
}
    
por 11.02.2016 / 12:02
-1

A solução que usei é usar Emacs . Eu abro o arquivo, encontro a parte com acentos, copio um caractere com sotaque e um caractere antes do acento. Eu vou para o começo do arquivo, executo M-x replace-string , cole o que eu copiei, vá para o começo do minibuffer, delete o caractere que estava antes, e execute o comando.

Eu percebi que o sotaque era mais como um pré-personagem, então copiando tanto o personagem que eu queria quanto o personagem antes, eu assegurei a copiar tudo o que eu queria.

    
por 11.02.2016 / 12:11