如何将latin1编码的ResultSet中的字符串转换成UTF-8编码

3

我正在编写一款应用程序(使用UTF-8编码),需要读写另一个外部应用程序的第二个数据库(使用ISO-8859-1编码)。

try {
    // data in latin1
    String s = rs.getString("sAddrNameF");
    System.out.println(s); // shows "Adresse d'exp�dition"
    byte[] data = s.getBytes();
    String value = new String(data, "UTF-8");
    System.out.println("data in UTF8: " + value);
    // The expected result should be "Adresse d'expédition"
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

这段代码无法正常运行,而且我仍需要进行相反的转换(写入数据库)。如果有人知道在同一个应用程序中处理不同编码的优雅解决方案,请告诉我,我会非常感激。


我正在使用UTF-8编码,IntelliJ也将其作为标准编码。 - Wellington Souza
有没有什么诀窍可以发现文件的编码?因为我刚刚恢复了一个数据库脚本备份。mysql -uroot -p < dbscript.sql - Wellington Souza
尝试运行 System.out.println("é\u00E9");,只有当这些 éé 能够正确显示时,才会出现问题。控制台不可靠,因为它使用自己的编码方式。在这里调整字节是错误的方法。更多地涉及到 Java JDBC 驱动程序传输协议的编码方式。 - Joop Eggen
任何程序员编辑器,如Notepad++或JEdit都可以用于识别编码。 - Joop Eggen
尝试将您的默认语言环境设置为latin1等效,然后运行您的代码。如果打印正确,则您的数据库和值本身都是正常的。 - bhantol
4个回答

6
String s = rs.getString("sAddrNameF");
System.out.println(s); // shows "Adresse d'exp�dition"

这意味着字符串在数据库中已经损坏,或者您使用错误的编码连接到数据库(例如在MySQL中传递characterEncoding=utf8)。
没有将字符串从一种编码转换为另一种编码的情况。一旦您拥有一个String,它始终是UTF-16。
如果只是配置问题,您不需要担心。 rs.getString()将返回正确的字符串,而PreparedStatement.setString()将确保字符串正确保存在数据库中。 关于Unicode你需要知道什么

好的,现在已经可以工作了。我相信原始文件(脚本.sql导出)被项目目录中的某个人使用IntelliJ修改并保存为UTF-8格式。我只是从头开始导出并恢复备份文件,现在它可以工作了。@Kayaman感谢你的帮助! - Wellington Souza

0

字符串值 = new String(data, "ISO-8859-1");


-1
我们需要将字符串标记为 StandardCharsets.UTF_8
try {
        // data in latin1
        String s = rs.getString("sAddrNameF");
        System.out.println(s); // shows "Adresse d'exp�dition"
        byte[] data = rs.getBytes("sAddrNameF");
        String value = new String(data, StandardCharsets.UTF_8);
        System.out.println("data in UTF8: " + value);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

-2

函数 getBytes 还可以接受一个字符集或者指定编码的字符串。

byte[] data = s.getBytes("UTF-8");
// or
byte[] data = s.getBytes(Charset.forName("UTF-8"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接