2

我有一个 Java 程序需要访问 Firebird 中编码为 DOS437 的数据库。

我需要将查询结果转换为 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;
}

我在火鸟连接中有一个编码:

<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 中。

4

1 回答 1

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 驱动程序)的开发人员

于 2013-11-26T12:45:45.673 回答