Tenho uma página de pesquisa, com um campo para digitar a string que o usuário quer procurar.
Dados:
Cabeçalhos:
<%@ page language="java" pageEncoding="ISO-8859-1" contentType="text/html;charset=ISO-8859-1"%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">, e é o primeiro item de <head>
<form method="POST" action="#" accept-charset="ISO-8859-1">
O código-fonte está em ISO-8859-1, o projeto está compilado (do zero, apagando os arquivos) em ISO-8859-1, e o Firefox 3.5 reporta a página como encoding ISO-8859-1. Tudo que consigo imaginar está nesse encoding.
Porém, se eu digito álcool, eu recebo no request um busca=%C3%A1lcool, e ele imprime áLcool.
C3A1 é o hexadecimal em UTF-8 para o caracter á. C3 e A1 em ISO-8859-1 são os caracteres à e ¡(exclamação ao contrário) respectivamente.
Testo usando o Windows Vista, e o resultado é o mesmo tanto no Firefox quanto no IE8.
A pergunta é, por que ainda estou recebendo UTF-8 do cliente, quando aponto tudo para um outro encoding? Poderia tratar isso na servlet, forçando o valor obtido para UTF-8, mas o que me dirá que o cliente mandará nesse formato?
Oi Bruno!
O que o request.getCharacterEncoding() retorna? Se for null, seta na mao pra 8859-1 num filtro antes de ler qualquer parametro. Eu chutaria que voce esta usando o jetty…
É, deu null mesmo. Estranho que até hoje nunca deu isso. (o problema, não esse nulo, nunca percebi pelo menos)
Sobre a aposta: OC4J 10.1.2 (ugh)
Pronto, criei um filtro, mapeei p/ *, setei na mão um request.setCharacterEncoding(“ISO-8859-1”);, verifiquei que ele passa por ele realmente seta o atributo.
Eeeeee…
(rufem os tambores)
.
…
…
Não deu certo.
Edit:
E minutos depois percebo que deveria setar como UTF-8!!
E…
(rufem os tambores)
.
…
…
Não deu certo.
Tsk, vou pra casa.
busca=%C3%A1lcool ta aparecendo na url do browser/post snifado? entao ai o problema é totalmente firefox/html, ja que ele é queme sta enviando utf-8.
Ok, atualização:
Estou usando o Prototype 1.5.1_rc3 para mandar as requisições via GET.
Debugando ele, para encodar os componentes da URL usa um método nativo dos navegadores, encodeURIComponent. De acordo com a documentação do MDC, ele encoda os caracteres em UTF-8, mesmo que na documentação do Protype Ajax.Options haja um atributo encoding (cujo padrão também é UTF-8).
Não sei se é problema dessa versão ou não, não vou checar. Provavelmente ele só muda o charset encoding do request, que parece que o servidor ignora completamente.
Então já que o getParameter está convertendo a requisição escapada em UTF-8 para ISO-8859-1, eu converto de volta:
String busca = new String(request.getParameter("busca").getBytes("ISO-8859-1"), "UTF-8");
Não estou muito satisfeito, mas quebra o galho.
bruno, sems er via ajax, um input field comum, ai vai certo? se for o culpado esta sendo o prototype!