Tenho um banco de dados que usa o firebird 1.0 e que a codificação está definida para NONE.
Fiz algumas comparações de códigos de caracteres com esta tabela e pude ver que os dados estão sendo gravados em ISO8859_1 (estações Windows 2000 e XP).
Estou tendo problemas para trazer caracteres acentuados em máquinas rodando Linux. Estou fazendo desta forma, resumidamente:
...
con = DriverManager.getConnection("jdbc:firebirdsql:db:/home/sismanfra/sam_nf.gdb", props);
...
ResultSet rs = (...)
String col = new String(rs.getBytes("coluna"), "ISO8859_1");
- No Windows, funciona sem problemas tanto usando o rs.getBytes() e convertendo quanto usando rs.getString()!!
Pois bem. O valor no banco de dados contém um “”, em “ROLÂNDIA”, que aparece convertido na variável col como um “Ï”. Usei um sniffer e pude ver que o “” está sendo trazido corretamente até a minha máquina, ou seja, código 0xc2 (194), só que o método getBytes o mostra como código -17!
Usando esta tabela, dá pra ver que o “” é realmente 0xc2 e também dá pra ver que se eu pegar o último caracter da tabela e voltar 17 posições, vou cair exatamente no “Ï” (0xEF / 239)!
O que acontece? Porque o Java converte isso de forma tão estranha? Não deveria ser mamão com açúcar converter de ISO8859_1 para UTF8?