[RESOLVIDO] Verificar Encode String

9 respostas
jomello_br

Olá amigos, existe alguma forma de verificar qual o encode de uma string recebida pelo servlet?

Eu já sei como converter os tipos, mas gostaria de saber de-para e para-de.

Desde já agradeço qualquer ajuda.

Obrigado

Jomello

public static String toISO88591(String text) throws Exception {

byte p[] = text.getBytes(UTF-8);

return new String(p, 0, p.length, ISO-8859-1);

}
/* para tratar os caracteres recebidos */
public static String toUTF8(String text) throws Exception {
    byte p[] = text.getBytes("ISO-8859-1");
    return new String(p, 0, p.length, "UTF-8");
}

9 Respostas

jomello_br

Bom amigos, já que ninguem se protificou para pelo menos me dar uma luz eu achei uma saida paleativa.

O grande problema (como sempre) é o nosso querido IE que ignora todas as configurações de charset ( no meu caso UTF-8) e ele manda os caracteres conforme a configuração padrão dele.

Ou seja quando mando alguma string via ajax, se é Firefox ele manda o que vc configura (UTF-8) mas se for o IE ele manda win1252 (iso-8859-1).

Não é uma Brastemp, mas pelo menos tenho como usar as funções acima mencionadas.

Mas se alguem tiver uma solução mais correta eu agradeço.

Abraços

Jomello

jomello_br

Opsss faltou dizer como saber qual é o Browser.

No seu Javascript coloque:

navegador = navigator.appName;

Ai é só mandar como parametro na sua chamada.

Haaa… se for Opera por Exemplo ele retorna Internet Explorer

Mas até onde eu vi, se o seu Browser for padrão Netscape, basta mandar firefox e se for padrão IE basta mandar IE ok

Abraços

Jomello

B

existe um post épico sobre encoding aqui no fórum, q sempre ajuda:
http://www.guj.com.br/posts/list/12456.java

jomello_br

Obrigado Bob pela ajuda, mas eu já li esse post e acredite, eu fiz tudo que esta nesse tutorial muito bom por sinal :slight_smile:

Mas o meu problema reside em alguns componentes do DOJO, que sei lá porque ele pega a configuração do IE e converte para win1252.

Exemplo no dijit.form.FilteringSelect, e é só na hora de mandar a string já no retorno ele retorna na boa :slight_smile:

Mas valeu pela dica e Feliz Natal

Abraços

Jomello

B

pelo que entendi seu problema é quando vc submete um formulário.
vc poderia usar mas o ie, pra variar, não suporta.
parace que existe um hack pra resolver isso no ie.
vc tem q colocar um campo com um caracter que é típico do encoding, aí o ie consegue detectar e enviar certo. assim:

<input type="hidden" name="segura_encoding" value="& #153;">

eu coloquei um espaço depois do &, mas ranca ele, tudo junto dentro das aspas… senão mostrava o símbolo em vez do código.

jomello_br

Valeu Bob, mas o meu problema esta no AJAX e não em postar o formulario.
Eu acho que descobri uma forma mais elegante para resolver o meu problema:
Quando recebo alguma string que não seja utf-8 ele manda caracteres diferente EX:

São = São

Ai caso não encontre alguma delas retorna N/A

Mas fico com a sensação de estar faltando algo :slight_smile:

public String RetCharSet(String str) throws IOException, Exception {

// Aqui coloco somente as letras que quero trabalhar, falta por exemplo acentos com trema

String cTabela = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzçÇáàâãÁÀÂÃéèêÉÈÊíìÍÌóòôõÓÒÔÕúùûÚÙÛ ";

char[] charsTab = cTabela.toCharArray();

char[] cPalavra = str.toCharArray();
int cCodTab;
    int cCodPal;
    String cEncode = "UTF-8";

    char cLetTab;
    char cLetPal;

    boolean lPassa = false;

    for (int i = 0; i < cPalavra.length; ++i) {
        cCodPal = (int)cPalavra[i];
        cLetPal = cPalavra[i];
        for (int j = 0; j < charsTab.length; ++j) {
            cCodTab = (int)charsTab[j];
            cLetTab = charsTab[j];
            if (cCodTab == cCodPal) {
                if (cLetTab == cLetPal) {
                    lPassa = true;
                    break;
                } else {
                    lPassa = false;
                }
            } else {
                lPassa = false;
            }
        }
        if (!lPassa) {
            break;
        }
    }
    if (!lPassa) {
        cEncode = "N/A";
    }

    return cEncode;
}
F

jomello_br:
Valeu Bob, mas o meu problema esta no AJAX e não em postar o formulario.
Eu acho que descobri uma forma mais elegante para resolver o meu problema:
Quando recebo alguma string que não seja utf-8 ele manda caracteres diferente EX:

São = São

Ai caso não encontre alguma delas retorna N/A

Mas fico com a sensação de estar faltando algo :slight_smile:

}</blockquote>

Revivendo um topico de 2009…
Eu estava com o mesmo problema e tambem fiquei com a sensação que estava faltando algo.
Por isso eu fui pesquisar e cheguei a sequinte conclusão :

Não esta faltando.
Inclusive, podemos adicionar alguns outros caracteres na tabela:

String cTabela = "!@#$%¨&*()_+={[}]/:;.,-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzçÇáàâãÁÀÂÃéèêÉÈÊíìÍÌóòôõÓÒÔÕúùûÚÙÛ ";

Apesar de ter varias diferenças entre o UFT-8 e o ISO-8859-1 , muitos caracteres (quase todos do ascii simples) possuem o mesmo valor em hexadecimal na tabela ascii,
fazendo com que esses caracteres visualizados tanto em ISO-8859-1 quanto em UTF-8 nao influenciem no resultado.

Encoding                Bytes      Hexadecimal    Valor
ISO-8859-1               1              61         a
UTF-8                    1              61         a

ISO-8859-1               1              62         b
UTF-8                    1              62         b

ISO-8859-1               1              63         c
UTF-8                    1              63         c

Para os casos onde a visualização sai desconfigurada na nossa pagina UTF-8, o valor hexadecimal retornado é diferente entre seus encoding.

Encoding              Bytes         Hexadecimal   Valor(exibido em uma pagina UTF-8)
ISO-8859-1              1              e7                ç
UTF-8                   2              c3a7              ç

ISO-8859-1              1              c7                Ã?
UTF-8                   2              c387              Ç

nesses casos, o problema ocorre quando o encoding onde o texto foi codificado é diferente do encoding que esta sendo lido.

ç
escrito em UTF mas lido em UTF-8                >> ç
escrito em UTF-8 mas lido em ISO-8859-1         >> ç
escrito em ISO-8859-1 mas lido em UTF-8         >> ?
escrito em ISO-8859-1 mas lido em ISO-8859-1    >> ç

Para nossa alegria, o metodo RetCharSet feito pelo jomello_br consegue verificar se o texto é compativel com uma visualização em UTF-8 ou não.

jomello_br

Olá Fabio, tudo bem contigo??? :slight_smile:

Foi super legal todo esse seu esclarecimento, mas eu cheguei a triste definição:

A melhor solução que encontrei foi usar sempre UTF-8 com um adento, usar UTF-8 inclusive no seu banco de dados, ai voce não terá nehum problema de acentuação.

Abraços

Jomello

F

jomello_br ,

Pelo que vi, seu caso era mais tranquilo. no meu caso, eu não tinha como garantir o encoding que era inserido em banco, pelo seguinte motivo:
O banco de dados existe a mais de 10 anos e é alimentado tanto pelo java web quanto por outro sistema em unix.

Nesse caso, ainda conseguimos verificar qual foi a rotina que enseriu errado e bloqueamos a possibilidade de gravar com caracter especial. (Uma vez que é inviavel no meu caso mudar configuração do banco).

Ainda por cima, a aplicação que tava dando zica é para plataforma Desktop (nao dava para consistir o encoding no servelet).
Depois de ficar quase tres dias procurando alguma forma de descobrir o encoding que estava armazenada em um hashMap, eu vi que não precisavada saber todos os encoding e sim se era UTF. Caso não fosse, eu considerava como sendo ISO (descartando as outras possibilidades) e convertia de volta para UTF.

Valeu pelo metodo. Quebrou maior galho.

OBS: Se você chegou na solução do seu problema, muda o post para resolvido. (Alem que pelo que percebi, você usou uma soluçao palhativa)
Abraços

Criado 16 de dezembro de 2009
Ultima resposta 25 de abr. de 2012
Respostas 9
Participantes 3