Encoding: Tudo está ISO-8859-1, cliente só manda UTF-8

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!