GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Comparar Strings com e sem acento


#1

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


#2

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


#3

[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.
}

#4

Não tem.

Você pode retirar os acentos de sua string antes de comparar.
http://www.rgagnon.com/javadetails/java-0456.html

[]´s
Rodrigo


#5

Hmmm..
:confused:

Obrigado à todo mundo.

Abraços.


#6

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

Expressões regulares - acentos
#7

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


#8

thingol, muito obrigado! Realmente funciona!


#9

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.


#10

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

#11

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


#12

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


#13

Valeuuuuuuu Jeffprestes

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

funfa msm ..

vlw pela dica =D ... !!!


#14

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

Parabéns e obrigado!

Att,
Eryckson Magno


#15

Muito bom. excelente !

Só 1 aviso: Normalizer ... Since: 1.6


#16

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

.


#17

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.


#18

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 .


#19

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.


#20

Que Jefferson ?

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.