Comparar Strings com e sem acento

Bom dia.
Alguém sabe se existe algum método de comparação da Classe String ignorando acentos?

ex.:

out("a".equals("á"));
// preciso que retorne true.

Abraço.s

acho que não…
até pq são dois caracteres diferentes…
alguém conhece algo do tipo
?

[quote=fabiozoroastro]Bom dia.
Alguém sabe se existe algum método de comparação da Classe String ignorando acentos?
ex.:

out("a".equals("á"));
// preciso que retorne true.

Abraço.s[/quote]

Crie um método que faça isso, tipo:

public static String semAcento(String txt) {
    String s="";
    for (int i = 0; i < txt.length(); i++) {
       char c=txt.charAt(i);
       switch (c) {
         case 'Á':
         case 'À':
         case 'Ã':
           c='A';
           break;
         case 'É':
         case 'Ê':
           c='E';
           break;
         case 'Í':
           c='I';
           break;
         case 'Ó':
         case 'Õ':
         case 'Ô':
           c='O';
           break;
         case 'Ú':
           c='U';
           break;
         case 'Ç':
           c='C';
           
         case 'á':
         case 'à':
         case 'ã':
           c='a';
           break;
         case 'é':
         case 'ê':
           c='e';
           break;
         case 'í':
           c='i';
           break;
         case 'ó':
         case 'õ':
         case 'ô':
           c='o';
           break;
         case 'ú':
           c='u';
           break;
         case 'ç':
           c='c';
           break;
       }
       s+=c;
    }
    return s;
  }

e na hora de chamar faça algo tipo:

if("a".equals(semAcento("á"))){
// preciso que retorne true.
}

Não tem.

Você pode retirar os acentos de sua string antes de comparar.

[]´s
Rodrigo

Hmmm…
:confused:

Obrigado à todo mundo.

Abraços.

Por incrível que pareça o Java tem uma classe que compara strings ignorando os acentos. É a classe Collator. Aqui vai um exemplo com o nome de uma xará da dona Gisele. (Obviamente a modelo não é Zózima, só pus esse nome para ter um acento agudo - a original só tem tremas no nome, já que o nome completo dela é “Gisele Carolina Nonnenmacher Bündchen”).

import java.util.*;
import java.text.*;

class ExemploCollator {
    public static void main(String[] args) {
        // Vamos comparar duas strings ignorando os acentos.
        String st1 = "Gisele da Conceição Zózima Bündchen";
        String st2 = "Gisele da Conceicao Zozima Bundchen";
        String st3 = "GISELE DA CONCEICAO ZÓZIMA BUNDCHEN";
        String st4 = "Gisele da Conceicao Zozimo Bundchen"; // note que esta string é diferente 
        Collator collator = Collator.getInstance (new Locale ("pt", "BR"));
	collator.setStrength(Collator.PRIMARY); // importante!
        if (collator.compare (st1, st2) == 0) {
            System.out.println ("As duas Giseles são a mesma pessoa, só diferem pelos acentos");
        }
        if (collator.compare (st1, st3) == 0) {
            System.out.println ("As duas Giseles são a mesma pessoa, só diferem pelos acentos e pela diferença 

de caixa");
        }
        if (collator.compare (st1, st4) != 0) {
            System.out.println ("As duas Giseles não são a mesma pessoa");
        }

        // Agora vamos mostrar um exemplo de ordenação ignorando os acentos.
        String[] dados = {
            "José Aparecido",
            "João Simões",
            "Jó Abedenego"
        };
        // Não usando "collator"
        SortedSet<String> s1 = new TreeSet<String>();
        for (String d : dados) {
            s1.add (d);
        }
        // Deve imprimir [José Aparecido, João Simões, Jó Abedenego], que é 
        // ao contrário das regras da língua portuguesa
        System.out.println (s1);
        // Usando "collator", segue as regras:
        // imprime "[Jó Abedenego, João Simões, José Aparecido]"
        final Collator coll = Collator.getInstance (new Locale ("pt", "BR"));
        SortedSet<String> s2 = new TreeSet<String>(new Comparator<String>() {
            public int compare (String o1, String o2) {
                return coll.compare (o1, o2);
            }
        });
        for (String d : dados) {
            s2.add (d);
        }
        System.out.println (s2);
    }
}
1 curtida

Poxa!! Muito interessante essa classe! Valeu pela dica, thingol! :wink:

thingol, muito obrigado! Realmente funciona!

Olá,

Estou precisando de uma coisa parecida: tenho que RETIRAR todos os acentos de uma String. Tem uma classe na API Java pronta que faz isso?

A classe Collation que o Thingol mostrou apenas compara duas Strings, não remove acentos.

Estou usando provisoriamente o código que o Marceloplis colocou aí em cima, mas gostaria de saber se tem uma classe da API Java que já faz isso para eu não ficar reinventando a roda.

No código que ele colocou ele esqueceu de remover alguns acentos, como “â”, “ü”, e se eu copiar o código dele talvez eu deixa passar alguns também, com certeza devem ter outros.

Para retirar os acentos - bah, vou postar de novo…

class RemoverAcentos {
    static String acentuado = "çÇáéíóúýÁÉÍÓÚÝàèìòùÀÈÌÒÙãõñäëïöüÿÄËÏÖÜÃÕÑâêîôûÂÊÎÔÛ";
    static String semAcento = "cCaeiouyAEIOUYaeiouAEIOUaonaeiouyAEIOUAONaeiouAEIOU";
    static char[] tabela;
    static {
        tabela = new char[256];
        for (int i = 0; i < tabela.length; ++i) {
	    tabela [i] = (char) i;
        }
        for (int i = 0; i < acentuado.length(); ++i) {
            tabela [acentuado.charAt(i)] = semAcento.charAt(i);
        }
    }
    public static String remover (final String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); ++i) {
            char ch = s.charAt (i);
            if (ch < 256) { 
                sb.append (tabela [ch]);
            } else {
                sb.append (ch);
            }
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String s = "Gisele Bündchen da Conceição e Silva foi batizada assim em homenagem à sua conterrânea de Horizontina, RS.";
        s = RemoverAcentos.remover (s);
        System.out.println (s);
    }
}

Obrigado, Thingol, vou votar para sua classe ser incorporada à API do Java na próxima versão.

Olá!

Vi que tinha pessoas que precisavam retirar acentos usando Java.
Há muitas formas, como li em outros posts aqui.
Mas, com base nessa URL http://www.rgagnon.com/javadetails/java-0456.html criei o código abaixo. Mais suscinto.
Espero que possa ajudar a quem precise.

/**
     * Gera uma string para ser utilizada como nome de arquivo. 
     * Ou como base de código para retirar acentos de um texto com Java
     * Os nomes são sem acento e ao invés de " " é usado _ .
     * @param nome string a ser usada como nome arquivo
     * @return retorna o nome do arquivo alterado.
     */
    public String limparNomeArquivo(String nome)     {
        nome = nome.replaceAll(" ","_");
        nome = Normalizer.normalize(nome, Normalizer.Form.NFD);
        nome = nome.replaceAll("[^\p{ASCII}]", "");
        return nome;
    }

Abs,

Jefferson Prestes

Valeuuuuuuu Jeffprestes

putz ma… vc me salvou … do que eu estava precisando

funfa msm …

vlw pela dica =D … !!!

Jefferson Prestes, sua solução é simplesmente perfeita!

Parabéns e obrigado!

Att,
Eryckson Magno

[quote=jeffprestes]Olá!

Vi que tinha pessoas que precisavam retirar acentos usando Java.
Há muitas formas, como li em outros posts aqui.
Mas, com base nessa URL http://www.rgagnon.com/javadetails/java-0456.html criei o código abaixo. Mais suscinto.
Espero que possa ajudar a quem precise.

/** * Gera uma string para ser utilizada como nome de arquivo. * Ou como base de código para retirar acentos de um texto com Java * Os nomes são sem acento e ao invés de " " é usado _ . * @param nome string a ser usada como nome arquivo * @return retorna o nome do arquivo alterado. */ public String limparNomeArquivo(String nome) { nome = nome.replaceAll(" ","_"); nome = Normalizer.normalize(nome, Normalizer.Form.NFD); nome = nome.replaceAll("[^\p{ASCII}]", ""); return nome; } [/quote]
Muito bom. excelente !

Só 1 aviso: Normalizer … Since: 1.6

[quote=romuloff][quote=jeffprestes]Olá!

Vi que tinha pessoas que precisavam retirar acentos usando Java.
Há muitas formas, como li em outros posts aqui.
Mas, com base nessa URL http://www.rgagnon.com/javadetails/java-0456.html criei o código abaixo. Mais suscinto.
Espero que possa ajudar a quem precise.

/** * Gera uma string para ser utilizada como nome de arquivo. * Ou como base de código para retirar acentos de um texto com Java * Os nomes são sem acento e ao invés de " " é usado _ . * @param nome string a ser usada como nome arquivo * @return retorna o nome do arquivo alterado. */ public String limparNomeArquivo(String nome) { nome = nome.replaceAll(" ","_"); nome = Normalizer.normalize(nome, Normalizer.Form.NFD); nome = nome.replaceAll("[^\p{ASCII}]", ""); return nome; } [/quote]
Muito bom. excelente !

Só 1 aviso: Normalizer … Since: 1.6[/quote]

Galera. Olha que beleza.
Achei uma biblioteca substituta da java.text.Normalizer pra quem estiver utilizando java 1.5:

O código fica igualzinho ao de cima.
Só muda Normalizer.Form.NFD pra Normalizer.NFD e o import de java.text.Normalizer pra com.ibm.icu.text.Normalizer
Bom proveito !

http://icu-project.org/apiref/icu4j/index.html?com/ibm/icu/text/Normalizer.html
http://icu-project.org

.

bom dia Jefferson Prestes,

Estou usando seu exemplo para tirar acentos de uma string, porém infeslismente não quando vou completar a linha do Normalizer, so aparece as opções :

nome = Normalizer.normalize(nome,Normalizer.COMPOSE,0);
(nome,Normalizer.DECOMP,0)

entre outros, mas essa parte : nome = Normalizer.normalize(nome, Normalizer.Form.NFD), não sei de onde veio esse Form.

Obrigada.

Se puder me dar um help.

[quote=VeraApFigueiredo]Estou usando seu exemplo para tirar acentos de uma string, porém infeslismente não quando vou completar a linha do Normalizer, so aparece as opções :

nome = Normalizer.normalize(nome,Normalizer.COMPOSE,0);
(nome,Normalizer.DECOMP,0)

entre outros, mas essa parte : nome = Normalizer.normalize(nome, Normalizer.Form.NFD), não sei de onde veio esse Form.

Obrigada.[/quote]Form é uma static Class/Enum de Normalizer. Veja na API:
http://java.sun.com/javase/6/docs/api/java/text/Normalizer.html#nested_class_summary
static class Normalizer.Form
This enum provides constants of the four Unicode normalization forms that are described in Unicode Standard Annex #15 ? Unicode Normalization Forms and two methods to access them.

@Vera,
Verifique se o import do Normalizer está assim:
import java.text.Normalizer

Assim como eu avisei anteriormente está classe está disponivel a partir do java 6.
Então se seu projeto não puder utilizar o java6; utilize a solução para o java 5 que coloquei aqui anteriormente: link .

hum, obrigada pela atenção Jefferson, mas percebi que o problema ta vindo de um outro lugar .

To usando o componente do Visual JSF (FileUpload), porém quando passo essa função:

String uploadedFileName = uploadedFile.getOriginalName();

Ele pega o nome original do arquivo, se este nome tiver acento, o lugar que está acentuado vem com caracteres especiais.
Porque eu preciso do nome do arquivo original com acento, para fazer o tratamento.

link do componente : http://www.netbeans.org/kb/60/web/fileupload_pt_BR.html

Se caso você souber de alguma coisa fico grata.

[quote=VeraApFigueiredo]hum, obrigada pela atenção Jefferson[/quote]Que Jefferson ?

[quote=VeraApFigueiredo]mas percebi que o problema ta vindo de um outro lugar[/quote]Ok. Sendo outro assunto alguem entendido lhe ajudará no topico que voce criou http://www.guj.com.br/posts/list/135737.java#730377
Senao fica muito bagunçado.