Para saber se é na sua servlet que os dados chegam errados, então é interessante imprimir o que está chegando.
Digamos que
String texto = request.getParameter ("texto");
seja a string da sua servlet que você desconfia que o browser está mandando com a codificação errada.
Agora vamos converter o texto para um array de bytes, e a seguir ver o que chegou. (Vamos usar a codificação "ISO-8859-1").
byte[] bytes = texto.getBytes ("ISO-8859-1");
Digamos que o texto que subiu seja "çã". Se os bytes vierem como C3 A7 C3 A3, eles estão subindo em UTF-8. Se vierem como E7 E3, estão subindo em Latin-1 (ISO-8859-1).
(estou mostrando em hexadecimal; você pode imprimi-los usando a seguinte função:
static void printHex(byte[] b) {
if (b == null) {
System.out.println ("(null)");
} else {
for (int i = 0; i < b.length; ++i) {
if (i % 16 == 0) {
System.out.print (Integer.toHexString ((i & 0xFFFF) | 0x10000).substring(1,5) + " - ");
}
System.out.print (Integer.toHexString((b[i]&0xFF) | 0x100).substring(1,3) + " ");
if (i % 16 == 15 || i == b.length - 1)
{
int j;
for (j = 16 - i % 16; j > 1; --j)
System.out.print (" ");
System.out.print (" - ");
int start = (i / 16) * 16;
int end = (b.length < i + 1) ? b.length : (i + 1);
for (j = start; j < end; ++j)
if (b[j] >= 32 && b[j] <= 126)
System.out.print ((char)b[j]);
else
System.out.print (".");
System.out.println ();
}
}
System.out.println();
}
}