Problema charset retorno pagseguro VRAPTOR

Fala ae…

Estamos com um problema, no retorno do pagseguro. Em toda nossa aplicação utilizamos o charset UTF-8, quando o pagseguro envia a requisição em ISO-8859-1 os parametros obtidos através da váriavel HttpServletRequest estão vindo descodificados. Procuramos diversas formas de descodificar via código, porem todas mal sucedidas.

Queremos continuar utilizando UTF8 porem na requisicao do pagseguro utilizar ISO-8859-1 para realizar as verificações.

Framework Utilizado: VRaptor 3.1.3

Alguem tem alguma idéia de como resolver esse problema?

ab[s].

vc pode tentar isso:

byte[] bytes = stringEmISO.getBytes("ISO-8859-1");
String stringEmUTF = new String(bytes, "UTF-8");

se não funcionar, tente inverter o ISO e o UTF-8 (nunca sei qual é a ordem certa :P)

Bom já tentei isso e a conversão não está funcionando, segue um exemplo via código do problema:


public class TesteConversao {

	public static void main(String [] args) {
		try {
			String decode = new String("Icaraí".getBytes("ISO-8859-1"), "UTF-8");
			
			//O problema é como conveter a variavel decode para ISO novamente.	
		
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

=/ …

pra converter pra ISO é só inverter o ISO-8859-1 com o UTF-8

Sim seria para funcionar… Até consegui converter no metodo passado. Mais no controller do vraptor nada ainda.

Segue abaixo o trexo de codigo.

System.out.println(request.getParameter(“CliBairro”));

RESPOSTA:
Icara?

Onde a resposta certa seria: Icaraí

Valew cara pela força.

e se vc faz:

System.out.println(new String(request.getParameter("CliBairro").getBytes("ISO-8859-1"), "UTF-8"));

Nada ainda. Continuo com o retorno:

System.out.println(new String(request.getParameter(“CliBairro”).getBytes(“ISO-8859-1”), “UTF-8”));

RESPOSTA:
Icara?

:(…

e invertendo ISO e UTF?

ou vc pode dar uma olhada nisso:
http://www.exampledepot.com/egs/java.nio.charset/ConvertChar.html

Nada de funcionar… :?

A questão é que eu recebo os caracteres exatamente iguais ao do codigo abaixo após executado.

String decode = new String(“Icaraíááó”.getBytes(“ISO-8859-1”), “UTF-8”);
System.out.println(decode);

Resultado: Icara???

Tentei de várias maneiras converter e não consegui.

Como converter a váriavel decode para ficar novamente como “Icaraíááó”?

:frowning:

o problema do VRaptor é que o dump dos parâmetros do Request acontece no Filter, o que não aconteceria se fosse no Servlet, quando o conteúdo está normalizado.

O conteúdo do Filter pode variar de acordo com o navegador ou de outro servidor de aplicação que é o caso do pagamento seguro. Isso sim é um problemão, porque para converter em UTF-8 é necessário uma análise dos parâmetros do HEADER.

o mesmo que chega no Filter do VRaptor é o que chegaria numa Servlet, não é esse o problema…

o problema é o sistema passar os parâmetros sem especificar o charset, daí o servidor chuta qual é.

por exemplo, se o cliente passasse o header:

Content-Type: application/x-www-form-urlencoded;charset=ISO-8859-1

já chegaria pro vraptor convertido corretamente.

[quote=Lucas Cavalcanti]o mesmo que chega no Filter do VRaptor é o que chegaria numa Servlet, não é esse o problema…
[/quote]

desculpe a minha insistencia, mas não é o mesmo conteúdo. O meu framework implementa boa parte das funcionalidades, também, no Filter. E mesmo assim, se deixa levar até um Servlet para resolver este problema de charset. Tanto disso que, inclusive, as requisições do tipo multipart-form/data também são normalizadas entre o Filter e o Servlet.

Na verdade, o navegador não respeita o conteúdo sugerido a visão apresentada, isso depende da configuração do navegador e pode ser forçada pelo usuário. Neste caso, configurações via META ou por HEADER são bypassadas.

A partir daqui, tudo que acontece contribui para o aumento da complexidade da aplição, é possível, por exemplo, configurar o form com um charset. Eu sei que no mundo JAVA, simplicidade é uma palavra proibida, quanto mais dificil melhor, aumeta o valor da hora. Mas fica mais facil utilizar um Servlet.

tenta usar essa configuração no web.xml pra ver se resolve:

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

Opa primeiramente obrigado pela ajuda.

Já estou usando essa configuração :frowning:

Outras Tentativas:

1 - Criar um interceptor para não converter em UTF8 as informações do PAG SEGURO , porem, não obtive sucesso.

2 - Simulei o mesmo problema criando um formulário externo a aplicação com codificação iso-8859-1 e enviando para o controller do vraptor no qual está configurado como utf8 e ocorre o mesmo problema. (Essa é uma forma de simular o problema que estamos passando).

3 - Quando alterei a linha do xml para ISO-8859-1 funcionou, porem toda a aplicação está escrita em UTF8, não tem como mudar.

Ta difícil… :shock:

oi pessoal

certeza que nao ha configuracao para o pagseguro fazer a requisicao em UTF-8, atraves de alguma configuracao?

é ruim mesmo msitrar um unico contexto a trabalhar com dois encodings. vai ter de fazer as conversoes, o que eh pessimo (melhor sempre as configuracoes).

me de um exemplo do que voce recebe na requisicao, char a char (codigo, nao o valor copiado e colado que pode haver distorcao).

daí pra fazer essa conversão, vc pode criar um interceptor do VRaptor @Intercepts(before=ParameterInstantiatorInterceptor.class) que converte todos os parâmetros da request de ISO para UTF-8.

pra isso é só receber um MutableRequest no construtor e fazer:

//para cada parametro:
request.setParameter(name, converte(request.getParameter(name)));