sexta-feira, 9 de dezembro de 2016

[Debug] Remover acentos utilizando Normalize


Fala galera que acompanha o blog...

Estava criando uma classe de utilitários, que logo pretendo disponibilizar aqui no blog, e acabei encontrando uma forma muito elegante de remover acentos de uma string utilizando o Normalize.




Se você pesquisar algo como "como remover acentos de uma string", vai perceber que existem diversas formas de faze-lo, usando arrays, mapa de caracteres, usando a biblioteca Apache Commons Lang, replaceAll com regex, indexOf() e várias outras formas. No entanto a classe Normalize, foi a que me chamou mais atenção, veja o código abaixo:

package com.devic.main;
import java.text.Normalizer;
public class Main {

 public static void main(String[] args) {
 String entrada = "çÇáéíóúýÁÉÍÓÚÝàèìòùÀÈÌÒÙãõñäëïöüÿÄËÏÖÜÃÕÑâêîôûÂÊÎÔÛ";
 System.out.println(Normalizer.normalize(entrada, Normalizer.Form.NFKD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""));
 }
}

Saida:

cCaeiouyAEIOUYaeiouAEIOUaonaeiouyAEIOUAONaeiouAEIOU

Bonito, não?

Esse trecho de código possui duas etapas:

  • Normalizar a nossa string seguindo o tipo de normalização enviado como parâmetro;
  • Realizar o replace de todos os caracteres normalizados para a sua forma normal.
Vamos ver outro código para entender melhor o que está acontecendo:

String entrada = "aáeéiíoóöőuúüű AÁEÉIÍOÓÖŐUÚÜŰ";
for (int i = 0; i < entrada.length(); i++) {
 
  // nos iremos escrever cada caracter separado, para visualizar melhor como ele funciona
  String texto = original.substring(i, i + 1);
 
  // realizando a normalização
  String decomposto = Normalizer.normalize(texto, Form.NFD);
  // removing diacritics
  String removido = decomposto.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

 System.out.println(texto + " (" + asHex(texto) + ") -> "
 + decomposto + " (" + asHex(decomposto) + ") -> "
 + removido + " (" + asHex(removido) + ")");
}


E a saída, ficará assim:

a (0061     ) -> a (0061     ) -> a (0061     )

á (00e1     ) -> á (0061 0301) -> a (0061     )

e (0065     ) -> e (0065     ) -> e (0065     )

é (00e9     ) -> é (0065 0301) -> e (0065     )

i (0069     ) -> i (0069     ) -> i (0069     )

í (00ed     ) -> í (0069 0301) -> i (0069     )

o (006f     ) -> o (006f     ) -> o (006f     )

ó (00f3     ) -> ó (006f 0301) -> o (006f     )

ö (00f6     ) -> ö (006f 0308) -> o (006f     )

ő (0151     ) -> ő (006f 030b) -> o (006f     )

u (0075     ) -> u (0075     ) -> u (0075     )

ú (00fa     ) -> ú (0075 0301) -> u (0075     )

ü (00fc     ) -> ü (0075 0308) -> u (0075     )

ű (0171     ) -> ű (0075 030b) -> u (0075     )

  (0020     ) ->   (0020     ) ->   (0020     )

A (0041     ) -> A (0041     ) -> A (0041     )

Á (00c1     ) -> Á (0041 0301) -> A (0041     )

E (0045     ) -> E (0045     ) -> E (0045     )

É (00c9     ) -> É (0045 0301) -> E (0045     )

I (0049     ) -> I (0049     ) -> I (0049     )

Í (00cd     ) -> Í (0049 0301) -> I (0049     )

O (004f     ) -> O (004f     ) -> O (004f     )

Ó (00d3     ) -> Ó (004f 0301) -> O (004f     )

Ö (00d6     ) -> Ö (004f 0308) -> O (004f     )

Ő (0150     ) -> Ő (004f 030b) -> O (004f     )

U (0055     ) -> U (0055     ) -> U (0055     )

Ú (00da     ) -> Ú (0055 0301) -> U (0055     )

Ü (00dc     ) -> Ü (0055 0308) -> U (0055     )

Ű (0170     ) -> Ű (0055 030b) -> U (0055     )


É isso ai pessoal, espero que tenham gostado e que seja bastante útil ai no projeto de vocês.

Até a próxima!
Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.