No Unicode, algumas combinações de caracteres têm mais de uma representação.
Por exemplo, o caractere ä pode ser representado como
- "ä", ou seja, o ponto de código U + 00E4 (dois bytes
c3 a4
na codificação UTF-8) ou como - "ä", ou seja, os dois pontos de código U + 0061 U + 0308 (três bytes
61 cc 88
em UTF-8).
De acordo com o padrão Unicode, as duas representações são equivalentes, mas em diferentes "formas de normalização", consulte UAX # 15: Formulários de Normalização Unicode .
A caixa de ferramentas unix tem todos os tipos de ferramentas de transformação de texto: sed , tr , iconv , Perl. Como posso fazer uma conversão NF rápida e fácil na linha de comando?
perl -MUnicode::Normalization -e 'print NFC(
... er o que vem aqui agora ...Respostas:
Você pode usar o
uconv
utilitário da UTI . A normalização é alcançada através da transliteração (-x
).No Debian, Ubuntu e outros derivados,
uconv
está nolibicu-dev
pacote. No Fedora, Red Hat e outros derivados, e nas portas BSD, está noicu
pacote.fonte
any-nfd
? Parece que o desenvolvimento desta ferramenta foi abandonada, última atualização foi em 2005.any-nfd
navegando pela lista exibida poruconv -L
.sudo apt install icu-devtools
para executaruconv -x any-nfc
, mas não resolva o problema mais simples , por exemplo, umbugText.txt
arquivo com "Iglésias, Bad-á, Good-á" convertido,uconv -x any-nfc bugText.txt > goodText.txt
mantendo o mesmo texto.O Python possui um
unicodedata
módulo em sua biblioteca padrão, que permite converter representações Unicode através daunicodedata.normalize()
função:Executando com o Python 3.x:
O Python não é adequado para liners de shell um, mas isso pode ser feito se você não quiser criar um script externo:
Para o Python 2.x, você deve adicionar a linha de codificação (
# -*- coding: utf-8 -*-
) e marcar as strings como Unicode com o caractere u:fonte
Verifique com a ferramenta hexdump:
converta com iconv e verifique novamente com hexdump:
fonte
utf-8-mac
no Linux e se isso é normal.Para completar, com
perl
:fonte
O coreutils possui um patch para obter o devido
unorm
. funciona bem para mim em wchars de 4 bytes. siga http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm O problema restante existem sistemas wchar de 2 bytes (cygwin, windows, mais aix e solaris em 32 bits), que precisam transformar pontos de código da parte superior planos em pares substitutos e vice-versa, e o libunistring / gnulib subjacente ainda não pode lidar com isso.O perl tem a
unichars
ferramenta, que também executa as várias formas de normalização no cmdline. http://search.cpan.org/dist/Unicode-Tussle/script/unicharsfonte
Existe um utilitário perl chamado Charlint disponível em
https://www.w3.org/International/charlint/
o que faz o que você quer. Você também terá que baixar um arquivo de
ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
Após a primeira execução, você verá Charlint reclamando de entradas incompatíveis nesse arquivo, e precisará excluir essas linhas do UnicodeData.txt.
fonte