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