Vraptor - problema com encoding

Olá,

Eu estou precisando validar os campos de um formulário por ajax. Estou usando jQuery:

jQuery.get(url, data, function(data) { validation[field] = data; }, "text");

Mas está dando algum problema de encoding. Caracteres como ‘ç’ não estão chegando corretamente. Eu já configurei pro eclipse usar UTF-8 em todos os lugares que eu achei alguma configuração de encoding. Eu fiz também a seguinte configuração no web.xm:

<context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param>

Além disso, a documentação do jQuery diz que ele usa UTF-8 por padrão.

Alguém tem alguma ideia do que pode ser?

Ninguém?

eu estava com um problema assim e resolvi da seguinte forma

		String utf8String = null;
		try {
			byte[] stringBytesISO = isoString.getBytes("ISO-8859-1");
			utf8String = new String(stringBytesISO, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			
		}

não sei se tem uma solução “mais bonita” para isso, mas essa foi a única que encontrei…

espero ter ajudado

[quote=roberto.rosin]eu estava com um problema assim e resolvi da seguinte forma

		String utf8String = null;
		try {
			byte[] stringBytesISO = isoString.getBytes("ISO-8859-1");
			utf8String = new String(stringBytesISO, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			
		}

não sei se tem uma solução “mais bonita” para isso, mas essa foi a única que encontrei…

espero ter ajudado[/quote]

Funcionou, mas tem outro problema. Se eu acessar essa rota pelo navegador direto, usando a codificação de caracteres, não funciona. Eu acho que o problema está justamente aí. O jQuery deve usar string UTF-8 mesmo, mas ele não deve codificar a URL antes de mandar a requisição. Vou dar uma pesquisada aqui, se eu achar algo eu posto a solução.

Eu acho que é um bug do Vraptor. Pra testar, eu tentei fazer a seguinte requisição pelo navegador:

Esta é a encoded URL pra:

Então eu criei um controller que tratasse essa requisição:

@Path("/{parametro}") public void validar(String parametro, String query) { System.out.println(parametro); System.out.println(query); result.use(Results.http()).body("true"); }

E no console é impresso o seguinte:

[quote]çãü
çãü[/quote]

Ou seja, parece que o Vraptor está dando decode na URL, mas não está dando decode nos parâmetros da query string. Alguém pode confirmar essa informação? Em qual classe do Vraptor eu poderia confirmar isso?

vc fez a requisição com o browser?

tenta fazer com outro cliente, tipo um CURL

[quote=Lucas Cavalcanti]vc fez a requisição com o browser?

tenta fazer com outro cliente, tipo um CURL[/quote]

Imprime a mesma coisa no console.

Quando eu não codifico a url, funciona com CURL. Mas o problema está sendo justamente a URL codificada. No browser nunca funciona, porque ele sempre codifica a URL.

O engraçado é que vc tá com o parâmetro de encoding setado né?

faz um teste, por favor:

  • cria uma servlet que responde por “/*”
  • remova o filtro do vraptor, ou faça isso em um projeto novo
  • no método service, imprima o request.getParameter(“query”); e o request.getRequestURI()

-veja se estão ok.

depois tenta mudar o encoding dessa forma:

que é o que o vraptor faz, e veja se faz alguma diferença.

[quote=Lucas Cavalcanti]O engraçado é que vc tá com o parâmetro de encoding setado né?

faz um teste, por favor:

  • cria uma servlet que responde por “/*”
  • remova o filtro do vraptor, ou faça isso em um projeto novo
  • no método service, imprima o request.getParameter(“query”); e o request.getRequestURI()

-veja se estão ok.

depois tenta mudar o encoding dessa forma:

que é o que o vraptor faz, e veja se faz alguma diferença.
[/quote]

Ué, eu removi o filtro do Vraptor do web.xml, mas continua caindo no filtro. Já dei clean no projeto e no servidor, mas não adiantou… Porque isso acontece?

Mas mesmo assim eu fiz o que vc falou. Quando eu acessei pelo navegador o console ficou assim:

[quote]çãü
/vraptor-blank-project/%C3%A7%C3%A3%C3%BC[/quote]

E quando eu acessei por CURL com a URL codificada ficou assim:

[quote]çãü
/vraptor-blank-project/%C3%A7%C3%A3%C3%BC[/quote]

E com a URL não codificada:

[quote]çãü
/vraptor-blank-project/çãü[/quote]

Depois eu criei um novo Dynamic Web Project, pra garantir que o filtro do Vraptor não ia influenciar e o resultado foi o mesmo.

Sobre fazer igual ao Vraptor, preciso saber pra qual encoding devo setar. UTF-8 mesmo?

UTF-8…

dá uma olhada se vc não precisa subir o servidor com o encoding setado…

tenta colocar isso na parte de argumentos da JVM do servidor:

-Dfile.encoding=UTF-8

no caso do eclipse, vc consegue isso clicando duas vezes no servidor e indo em “Open launch configuration”

[quote=Lucas Cavalcanti]UTF-8…

dá uma olhada se vc não precisa subir o servidor com o encoding setado…

tenta colocar isso na parte de argumentos da JVM do servidor:

-Dfile.encoding=UTF-8

no caso do eclipse, vc consegue isso clicando duas vezes no servidor e indo em “Open launch configuration”

[/quote]

Tentei fazer como o Vraptor faz e deu a mesma coisa:

[quote]çãü
/Teste/%C3%A7%C3%A3%C3%BC[/quote]

Também coloquei o argumento na JVM, dei clean no servidor e rodei, mas não fez efeito nenhum. Continua a mesma coisa.

Eu descobri algo interessante: se eu usar $.post os caracteres chegam direitinho. Acho que é algum bug no jQuery ou no Vraptor. Acho que o problema está no “encode/decode” da URL. No caso do post, os dados vão no corpo da requisição, aí não tem esse problema.