Tirar caracteres especiais de uma String

9 respostas
P

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

9 Respostas

maquiavelbona

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.

J

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+

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 =
		(" !'#$%&'()*+\-./[telefone removido]:;<->?@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();
	}
S

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 <em>/

private static final char[] FIRST_CHAR =

(" !’#$%&’()</em>+\-./[telefone removido]:;<->?@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 <em>/

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();

/</em>*
  • 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 <em>/
    
    private static final char[] FIRST_CHAR =
    
    (" !’#$%&’()</em>+\-./[telefone removido]:;<->?@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 <em>/
    
    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();
    
    /</em>*
    
    • 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.

T

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

m0sk4

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

vymerson

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}]","");

}
vitor_lima
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;
	}

Talvez ?

sergiotaborda

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

Nada de gambiarra.

Criado 29 de junho de 2006
Ultima resposta 6 de nov. de 2009
Respostas 9
Participantes 9