我有一个Java程序需要使用编码DOS437来访问Firebird中的数据库。
我需要将查询结果转换为UTF8,我该怎么做?
我在java中的代码:
public List<Proceso> ObtenerListaProcesos() throws SQLException {
List<Proceso> procesos = new ArrayList<>();
Proceso proceso = null;
Connection conn = null;
ResultSet rs = null;
String query = "select * from procesos where prc_web='V' and prc_valido='V' and prc_valido_fabrica='V' and prc_suplemento_Acabado='F' and prc_codigo!='-' order by prc_descripcion;";
String textoProceso="";
try {
conn = this.abrirConexion();
PreparedStatement p = conn.prepareStatement(query);
rs = p.executeQuery();
while (rs.next()) {
proceso = new Proceso(rs.getString("PRC_CODIGO"),
rs.getString("PRC_DESCRIPCION"));
procesos.add(proceso);
}
} catch (Exception e) {
log.error("Error en ObtenerListaProcesos: " + e.getMessage());
} finally {
this.cerrarConexion(conn);
}
return procesos;
}
我在firebird连接中有一个编码:
<conexionServidor>jdbc:firebirdsql:servidor/3050:F:/apps/GESTIONGYM2004/BD/BDGYM.FDB</conexionServidor>
<userBD>SYSDBA</userBD>
<passBD>masterkey</passBD>
<encodingBD>DOS437</encodingBD>
我需要在utf-8中写入查询结果以显示在html文件中,但是如果使用:new String(rs.getBytes(“columnname”),“Cp437”),结果不是UTF-8。
答案 0 :(得分:3)
假设您的数据库有一个默认字符集(或每个(VAR)CHAR列的特定字符集),您只需指定一个连接字符集,Firebird将从存储编码音译到连接编码;这可以是任何包含DOS437完整曲目的字符集(例如UTF8,也包括DOS437本身)。
如果您的数据库没有默认字符集(它是NONE),或者数据列的字符集为NONE,则不会有全自动音译,您需要明确指定连接字符集DOS437和Jaybird将处理转换。
您可以使用连接属性encoding
(接受Firebird字符集名称)或charSet
(接受Java字符集名称)指定连接字符集,例如:
jdbc:firebirdsql://localhost//path/to/db.fdb?encoding=DOS437
您提到要转换为utf8,但这无关紧要。您只需要Jaybird读取正确字符集中的数据,即可将正确的字符转换为Java。之后,只需将其作为UTF-8写入目的地即可。
如果您有非常特殊的需求并且无法指定连接字符集,则可以使用new String(rs.getBytes("columnname"), "Cp437")
自行进行转换,但这应该是最后的手段。
免责声明:我是Jaybird(Firebird JDBC驱动程序)的开发人员