Tirar caracteres especiais de uma String

Pessoal tem como eu trocar os caracteres especiais tipo é, ã, ç, etc por respectivamente e, a e c?

Existe um método da Classe String chamado replaceAll(String stringAProcurar, String stringQueSeraReposta)

exemplo:

String video = new String("teséar").replaceAll("é","e");
System.out.println(video);

A saída na tela seria: tesear.

Espero ter ajudado.

Cara isso é uma coisa que a um tempo atrás eu tive que fazer, e fiz da forma braçal mesmo.
Tipo, não tem em Java (ou eu não achei ao menos) como fazer um replace passando um conjunto como em JavaScript
var name = “zézinho”
name.replaceAll(“éeãa…”)

O que eu fiz foi criar uma matriz com entrada e saída. Entrada é o valor que eu espero encontrar na string e saída o que colocar no lugar.
Dae eu fiz replaceAll.

± isso:

String caracteresEspeciais[][] = new String[54][2];
caracteresEspeciais[0][0] = “á”;
caracteresEspeciais[0][1] = “a”;
caracteresEspeciais[1][0] = “Á”;
caracteresEspeciais[1][1] = “A”;
caracteresEspeciais[2][0] = “à”;
caracteresEspeciais[2][1] = “a”;
caracteresEspeciais[3][0] = “À”;
caracteresEspeciais[3][1] = “A”;
caracteresEspeciais[4][0] = “â”;
caracteresEspeciais[4][1] = “a”;
caracteresEspeciais[5][0] = “”;
caracteresEspeciais[5][1] = “A”;

Depois num for eu percorro essa string e vou testando se acho na minha entrada algo que tenha que trocar. Era isso.

Não sei se é o certo e tal, mas ta, não perdi mais que 5 minutos pra fazer isso e perderia mais de hora estudando uma outra forma.

Mas da uma olhada em expressões regulares, deve ter algo que faça isso de uma forma mais limpa hehehe.

T+

Isto pode ser modificado segundo suas necessidades. Pegue uma tabela ANSI (use o utilitário CharMap.exe do Windows, ou o seu equivalente no Linux) para alterar uma das duas strings abaixo.

	/** Para a normalização dos caracteres de 32 a 255, primeiro caracter */
	private static final char[] FIRST_CHAR =
		(" !'#$%&'()*+\-./0123456789:;<->?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
			+ "[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ E ,f'.++^%S<O Z  ''''.-"
			+ "-~Ts>o ZY !C#$Y|$'(a<--(_o+23'u .,1o>113?AAAAAAACEEEEIIIIDNOO"
			+ "OOOXOUUUUyTsaaaaaaaceeeeiiiidnooooo/ouuuuyty")
			.toCharArray();
	/** Para a normalização dos caracteres de 32 a 255, segundo caracter */
	private static final char[] SECOND_CHAR =
		("  '         ,                                               "
			+ "\                                   $  r'. + o  E      ''  "
			+ "  M  e     #  =  'C.<  R .-..     ..>424     E E            "
			+ "   E E     hs    e e         h     e e     h ")
			.toCharArray();
	/**
	 * Efetua as seguintes normalizações para obtenção de certificados:
	 * - Elimina acentos e cedilhas dos nomes;
	 * - Converte aspas duplas em simples;
	 * - Converte algumas letras estrangeiras para seus equivalentes ASCII
	 * (como ß, convertido para ss) 
	 * - Põe um "\" antes de vírgulas, permitindo nomes como
	 * "Verisign, Corp." e de "\", permitindo nomes como " a \ b ";
	 * - Converte os sinais de = para -
	 * - Alguns caracteres são removidos:
	 * -> os superiores a 255,
	 * mesmo que possam ser representados por letras latinas normais
	 * (como s, = U+015E = Latin Capital Letter S With Cedilla);
	 * -> os caracteres de controle (exceto tab, que é trocado por um espaço)
	 * @param str A string a normalizar.
	 * @return A string normalizada.
	 */
	public static String normalize(String str) {
		char[] chars = str.toCharArray();
		StringBuffer ret = new StringBuffer(chars.length * 2);
		for (int i = 0; i < chars.length; ++i) {
			char aChar = chars[i];
			if (aChar == ' ' || aChar == '\t') {
				ret.append(' '); // convertido para espaço
			} else if (aChar > ' ' && aChar < 256) {
				if (FIRST_CHAR[aChar - ' '] != ' ') {
					ret.append(FIRST_CHAR[aChar - ' ']); // 1 caracter
				}
				if (SECOND_CHAR[aChar - ' '] != ' ') {
					ret.append(SECOND_CHAR[aChar - ' ']); // 2 caracteres
				}
			}
		}

		return ret.toString();
	}

Ola thingol, eu gostei do seu codigo para nomalização de caracteres especilais, porem eu não entendi o trecho do codigo abaixo:
no if (FIRST_CHAR[aChar - ’ '] != ’ ') ele pega uma posição do array e verifica se é diferente de vazio, porem essa posição é um valor ou seja um caracter - ’ ’ como assim?

/** Para a normalização dos caracteres de 32 a 255, primeiro caracter /
private static final char[] FIRST_CHAR =
(" !’#$%&’()
+\-./0123456789:;<->?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ “[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ E ,f’.++^%S<O Z ‘’’’.-”
+ “-~Ts>o ZY !C#$Y|$’(a<–(_o+23’u .,1o>113?AAAAAAACEEEEIIIIDNOO”
+ “OOOXOUUUUyTsaaaaaaaceeeeiiiidnooooo/ouuuuyty”)
.toCharArray();
/** Para a normalização dos caracteres de 32 a 255, segundo caracter /
private static final char[] SECOND_CHAR =
(" ’ , "
+ "\ $ r’. + o E ‘’ "
+ " M e # = 'C.< R .-… …>424 E E "
+ " E E hs e e h e e h ")
.toCharArray();
/
*

  • Efetua as seguintes normalizações para obtenção de certificados:

    • Elimina acentos e cedilhas dos nomes;
    • Converte aspas duplas em simples;
    • Converte algumas letras estrangeiras para seus equivalentes ASCII
  • (como ß, convertido para ss)

    • Põe um “” antes de vírgulas, permitindo nomes como
  • “Verisign, Corp.” e de “”, permitindo nomes como " a \ b ";

    • Converte os sinais de = para -
    • Alguns caracteres são removidos:
  • -> os superiores a 255,

  • mesmo que possam ser representados por letras latinas normais

  • (como s, = U+015E = Latin Capital Letter S With Cedilla);

  • -> os caracteres de controle (exceto tab, que é trocado por um espaço)

  • @param str A string a normalizar.

  • @return A string normalizada.
    */
    public static String normalize(String str) {
    char[] chars = str.toCharArray();
    StringBuffer ret = new StringBuffer(chars.length * 2);
    for (int i = 0; i < chars.length; ++i) {
    char aChar = chars[i];
    if (aChar == ’ ’ || aChar == ‘\t’) {
    ret.append(’ '); // convertido para espaço
    } else if (aChar > ’ ’ && aChar < 256) {
    if (FIRST_CHAR[aChar - ’ '] != ’ ') {
    ret.append(FIRST_CHAR[aChar - ’ ']); // 1 caracter
    }
    if (SECOND_CHAR[aChar - ’ '] != ’ ') {
    ret.append(SECOND_CHAR[aChar - ’ ']); // 2 caracteres
    }
    }
    }

    return ret.toString();
    }
    /** Para a normalização dos caracteres de 32 a 255, primeiro caracter /
    private static final char[] FIRST_CHAR =
    (" !’#$%&’()
    +\-./0123456789:;<->?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    + “[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ E ,f’.++^%S<O Z ‘’’’.-”
    + “-~Ts>o ZY !C#$Y|$’(a<–(_o+23’u .,1o>113?AAAAAAACEEEEIIIIDNOO”
    + “OOOXOUUUUyTsaaaaaaaceeeeiiiidnooooo/ouuuuyty”)
    .toCharArray();
    /** Para a normalização dos caracteres de 32 a 255, segundo caracter /
    private static final char[] SECOND_CHAR =
    (" ’ , "
    + "\ $ r’. + o E ‘’ "
    + " M e # = 'C.< R .-… …>424 E E "
    + " E E hs e e h e e h ")
    .toCharArray();
    /
    *

    • Efetua as seguintes normalizações para obtenção de certificados:

      • Elimina acentos e cedilhas dos nomes;
      • Converte aspas duplas em simples;
      • Converte algumas letras estrangeiras para seus equivalentes ASCII
    • (como ß, convertido para ss)

      • Põe um “” antes de vírgulas, permitindo nomes como
    • “Verisign, Corp.” e de “”, permitindo nomes como " a \ b ";

      • Converte os sinais de = para -
      • Alguns caracteres são removidos:
    • -> os superiores a 255,

    • mesmo que possam ser representados por letras latinas normais

    • (como s, = U+015E = Latin Capital Letter S With Cedilla);

    • -> os caracteres de controle (exceto tab, que é trocado por um espaço)

    • @param str A string a normalizar.

    • @return A string normalizada.
      */
      public static String normalize(String str) {
      char[] chars = str.toCharArray();
      StringBuffer ret = new StringBuffer(chars.length * 2);
      for (int i = 0; i < chars.length; ++i) {
      char aChar = chars[i];
      if (aChar == ’ ’ || aChar == ‘\t’) {
      ret.append(’ '); // convertido para espaço
      } else if (aChar > ’ ’ && aChar < 256) {
      if (FIRST_CHAR[aChar - ’ '] != ’ ') {
      ret.append(FIRST_CHAR[aChar - ’ ']); // 1 caracter
      }
      if (SECOND_CHAR[aChar - ’ '] != ’ ') {
      ret.append(SECOND_CHAR[aChar - ’ ']); // 2 caracteres
      }
      }
      }

      return ret.toString();
      }

Obrigado.

Debugue o programa , e veja o que ocorre. É mais fácil que eu tentar explicar.

http://www.guj.com.br/posts/list/85693.java#458584

Temos um outra opção também mais resumida:

public static String formatString(String s) {
String temp = Normalizer.normalize(s, java.text.Normalizer.Form.NFD);
return temp.replaceAll("[^\p{ASCII}]","");
}

1 curtida

[code]public static String normalizaString(String s){

	String normalizada="";
	
	for(int x=0;x<s.length();x++){
		switch (s.charAt(x)) {
		case 'á':
		case 'â':
		case 'à':
		case 'ã':
		case 'ä':
				normalizada+="a";				
			break;
		
		case 'é':
		case 'ê':
		case 'è':
		case 'ë':
				normalizada+="e";				
			break;

		case 'í':
		case 'î':
		case 'ì':
		case 'ĩ':
		case 'ï':
				normalizada+="i";				
			break;
		case 'ó':
		case 'ô':
		case 'ò':
		case 'õ':
		case 'ö':
				normalizada+="o";				
			break;
			
		case 'ú':
		case 'û':
		case 'ù':
		case 'ũ':
		case 'ü':
				normalizada+="u";				
			break;
			
		default:
				normalizada+=s.charAt(x);
			break;
		}
	}
	
	return normalizada;
}

[/code]

Talvez ?

Utilize java.text.Normalizer e regex . Veja um exemplo aqui

Nada de gambiarra.