Solução definitiva de remoção de acentos

Remoção de acentos é um assunto recorrente. No StackOverflow em português tem 83 perguntas sobre o assunto, que vão muito além de perguntas duplicadas. Na minha carreira já me deparei várias vezes com essa necessidade e imagino que seja assim com você também.

Apresento então a solução final para remoção de acentos, que pode funcionar em qualquer linguagem de programação: utilizar a Forma de Normalização Unicode “NFD” (Unicode Normalization Form Canonical Decomposition) seguida por substituição com expressão regular por propriedades unicode ou intervalo de caracteres.

Ok, mas como isso funciona na prática?

Existe um bloco de caracteres unicode que alteram o caractere anterior para produzir caracteres acentuados chamado Combining Diacritical Marks com intervalo de 0300 até 036f. A ideia é normalizar todos os caracteres acentuados com esse bloco usando decomposição.

A remoção desse grupo com expressão regular tem duas abordagem possíveis: usar grupo com o intervalo (colchetes []) ou propriedade unicode (sequência de escape \p). Nos dois casos é necessário usar o modificador u da expressão regular para tratar a string como unicode.

Descrevo dois exemplos nas linguagens que tenho maior domínio:

Em PHP é necessário ter extensão de internacionalização intl habilitada.

Pela propriedade unicode Mn ou M:

preg_replace('/\p{Mn}/u', '', normalizer_normalize($stringComAcentos, Normalizer::FORM_D));

Outra opção é '/pM/u'. Ou por grupo com intervalo a expressão regular será '/[\x{0300}-\x{036f}]/u'.

Em Javascript (ou node) recomendo usar o grupo com intervalo porque na data de publicação desse artigo o Firefox não suporta \p. A função replace precisa do modificador g para remover todas as ocorrências:

stringComAcentos.normalize('NFD').replace(/[\u0300-\u036f]+/ug, '')

Ignorando a questão de compatibilidade a regex pode ser a mesma da utilizada em PHP: /\p{Mn}/u. A nomenclatura de propriedade em Javascript tem varia mas todas elas funcionam da mesma forma: /\p{Dia}/u, /\p{Diacritic}/u e /\p{M}/u. A sintaxe sem chaves não funciona nessa linguagem.

Espero essa explicação possibilite que você lembre porque esse código funciona e quando houver necessidade você possa usar essa solução.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s