Tirar caracteres especiais de uma String.  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

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

-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
maquiavelbona
JWizard
[Avatar]

Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline

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

exemplo:


A saída na tela seria: tesear.

Espero ter ajudado.

----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)

"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781)
jmchel
Smalltalk

Membro desde: 29/06/2006 15:40:20
Mensagens: 1
Offline

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+
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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.

[WWW]
Sebode
Entusiasta Java

Membro desde: 27/12/2006 12:39:55
Mensagens: 15
Offline

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.
[MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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


[WWW]
m0sk4
Smalltalk
[Avatar]

Membro desde: 11/02/2008 14:56:07
Mensagens: 3
Offline

http://www.guj.com.br/posts/list/85693.java#458584
vymerson
What is classpath?
[Avatar]

Membro desde: 14/08/2008 16:30:56
Mensagens: 6
Localização: Mato Grosso do Sul - Campo Grande
Offline

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

Seja a mudança que você deseja ver no mundo. "Mahatma Gandhi"
[Email] [WWW] [MSN]
vitor lima
JavaBaby
[Avatar]

Membro desde: 14/04/2009 09:16:59
Mensagens: 92
Offline




Talvez ?

This message was edited 1 time. Last update was at 06/11/2009 13:20:26

sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

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


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

Nada de gambiarra.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team