Olá
Um assunto para discussão: em sites só para brasileiros devemos usar ISO-8859-1 ou partimos logo para UTF-8. Abaixo coloco uma série de considerações cuja maior parte vale para ambos os encodings apesar de que está feito para o UTF-8.
Resumo dos passos para usar encoding UTF-8 em sites servidos pelo Tomcat:
1. Todas as páginas html devem começar por:<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<form action=". . ." accept-charset="iso-8859-1,utf-8">
@charset "utf-8"
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page
contentType="text/html; charset=UTF-8"
%>
-Dfile.encoding=UTF-8
8. É preciso muita atenção com o método HttpServletRequest.setCharacterEncoding("utf-8"); que só se aplica ao body e NÃO à URI. E este método PRECISA ser chamado ANTES de pegar os parâmetros e por isso não funciona quando há um filtro que chama antes request.getParameter()
9. Considerar a seguinte importante diferença que há entre Tomcat 4 e Tomcat 5: O conector Coyote HTTP/1.1 tem um atributo useBodyEncodingForURI que setado para true usará o encoding do "request body" para decodificar os parametros que vem na URI
- O default é true para TC4 (desacordo com a espec. porém mantém consistência com versões antigas)
- O default é false para TC5 (cumpre a espec. mas pode exigir alterações em aplicações antigas)
/**
* Converte o formato ISO8859-1 (default IE) para UTF-8
*/
public 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;
}
Se alguém discorda do resumo acima ou precisa acrescentar algum passo por favor se manifeste. Comentários e correções serão bem-vindos.
Depois de fixado o encoding temos um problema adicional: as senhas criptografadas na base de dados antes da mudança do encoding.
Perguntas:
1. Qual encoding usar?
2. Considerando uma base de dados sem nacionalizar o conjunto de caracteres (National Character Set default), quais problemas podem acontecer ao tentar modificar uma senha criptografada armazenada na base de dados antes das mudanças no encoding?
[]s
Luca
