Como converter o texto passado pelo usuário através de um formulário para utf-8?

11 respostas
L

Oi gente,

Estou com um problema que há dias não consigo resolver que é o seguinte: em uma página de cadastro de cliente foi me pedido que eu passasse toda a informação cadastrada pelo usuário por email para a sessão de atendimento da empresa antes que tudo fosse salvo no banco. Mas os dados que são passados pelo usuário estão aparecendo no email e no banco de dados com erro de decodificação dos caracteres (por exemplo: o nome Eustácio aparece como Eustácio).

Já tentei diversas táticas diferentes para sanar o problema mas sem sucesso em nenhuma. Já verifiquei as tags nos jsps que poderiam estar influindo nisso: inclui tags <%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" language="java" /> nas páginas envolvidas; a tag está definindo o charset correto; e inclui o atributo acceptCharset="utf-8" nas tags

dos jsps envolvidos. Já tentei fazer a conversão via código java também, usando InputStreamReader, CharsetDecoder e CharsetEncoder. Nada deu certo.

Segue abaixo o método que criei para tentar converter alguns campos do formulário para utf-8:
private String[] convertToUtf8 (Client cliente) throws CharacterCodingException
  {
      String result[] = new String[3];
      Charset charset = Charset.forName("UTF-8");
      CharsetDecoder decoder = charset.newDecoder();
      CharsetEncoder encoder = charset.newEncoder();
      
      ByteBuffer bb = encoder.encode(CharBuffer.wrap(cliente.getFullName()));
      CharBuffer cb = decoder.decode(bb);
      String fullname = montarString(cb);
      result[0] = fullname;
      
      ByteBuffer bb1 = encoder.encode(CharBuffer.wrap(cliente.getMobileCarrier().getName()));
      cb = decoder.decode(bb1);
      String mobilecarrier = montarString(cb);
      result[1] = mobilecarrier;
      
      ByteBuffer bb2 = encoder.encode(CharBuffer.wrap(cliente.getHomeAddress().getFullAddressName()));
      cb = decoder.decode(bb2);
      String homeaddress = montarString(cb);
      result[2] = homeaddress;

      bb.clear(); bb1.clear(); bb2.clear();
      
      return result;
  }

Alguém tem alguma sugestão? Desde já agradeço.

Leonel

11 Respostas

V

Já esperimentou usar charset=windows-1252 ?

L

Não, mas o problema é que o portal deve ser mantido com codificação “utf-8” devido à uma possível internacionalização.

peczenyj

O grande problema de vc converter pra UTF-8 é descobrir qual a codificação utilizada.

Ja experimentou forçar no header isso:

Content-Type: text/html; charset=utf-8
m0ska

Você por acaso estaria usando o tomcat? que sistema operacional vc está usando?

L

Sim, já fiz isso.

Sim, estou usando o tomcat 5.5, no Ubuntu 8.04

bruxel

alem dessas dicas, o usuario não esta forçando utilizar no browser outra codificação.

iso acontece para vários usuarios ou algum isolado?

m0ska

Pois é meu caro, também tive esse problema de codificação no Ubuntu 8.04 e 8.10
Usando o tomcat neste.

Eu tive que fazer um filtro pra pegar todo o conteúdo das requisições e converter na marra. Mas isso só acontece com o ubuntu + tomcat, pelo menos comigo.

L

Como assim fez um filtro para pegar o conteúdo das requisições? Como fez isso?

Para mandar o email, o seguinte método resolveu o problema (sei que não é geral, mas resolveu momentanemente):

private String toUTF8(String isoString)
   {
       String utf8String = null;   
       if (null != isoString && !isoString.equals(""))   
       {   
           try   
           {   
               byte[] stringBytesISO = isoString.getBytes("ISO-8859-1");   
               utf8String = new String(stringBytesISO, "UTF-8");   
           }   
           catch(UnsupportedEncodingException e)   
           {   
               // Mostra exceção mas devolve a mesma String   
               System.out.println("UnsupportedEncodingException: " + e.getMessage());   
               utf8String = isoString;   
           }   
       }   
       else   
       {   
           utf8String = isoString;   
       }   
       return utf8String;   
   }

Para salvar no banco utilizei o mesmo métod, mas em outros pontos do código, em que as entidades eram preenchidas.

Bom, obrigado a todos pela ajuda.

Até

m0ska
public class UTF8Converter implements Filter {
	
	public void destroy() { }

	/** Preform the filtering. */
	public void doFilter(ServletRequest request, ServletResponse response,
		FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
	}

	public void init(FilterConfig config) throws ServletException { }

}

Coloquei no web.xml pra toda requisição que for feita pelo meu command, passar por este filtro, assim tudo é convertido pra utf-8 na marra.

L

Hmmm… Ideia muito boa m0ska… Vou ver se rola de adotar isso no projeto aqui…
Valeu a dica…

F

m0ska , sua sujestão funcionou direitinho .

valew pela dica

Criado 4 de fevereiro de 2009
Ultima resposta 2 de fev. de 2012
Respostas 11
Participantes 6