【问题标题】:How to encode a string in UTF-8 from a ResultSet encoded in latin1如何从以 latin1 编码的 ResultSet 中以 UTF-8 编码字符串
【发布时间】:2017-01-19 07:17:39
【问题描述】:

我正在编写一个应用程序(使用 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 使用的是 UTF-8 作为标准
  • 发现文件编码的任何技巧?因为我只是恢复了一个数据库脚本备份。 mysql -uroot -p < dbscript.sql
  • 尝试System.out.println("é\u00E9"); 只有当那些éé 显示正确时,才有问题。控制台不可靠,因为它使用自己的编码。在这里摆弄字节是错误的方法。更多java JDBC驱动传输协议的编码。
  • Notepad++ 或 JEdit 等任何程序员编辑器都可以识别编码。
  • 尝试将您的默认语言环境设置为 latin1 等效项,然后运行您的代码。您应该看到您的系统打印正确。如果你这样做了,那么你 db 和值本身就可以了。

标签: java encoding utf-8 resultset iso-8859-1


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我们需要将字符串记为 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();
        }
    

    【讨论】:

      【解决方案3】:
      String s = rs.getString("sAddrNameF");
      System.out.println(s); // shows "Adresse d'exp�dition"
      

      这意味着该字符串在数据库中已经损坏,或者您使用错误的编码连接到数据库(例如使用 MySQL 传递 characterEncoding=utf8)。

      没有将字符串从一种编码转换为另一种编码这样的事情。一旦你有了String,它总是 UTF-16。

      如果只是配置问题,不用担心。 rs.getString() 将返回正确的字符串,PreparedStatement.setString() 将确保字符串正确保存在数据库中。

      What you should know about Unicode

      【讨论】:

      • 好的,现在正在工作,我相信原始文件(脚本.sql 导出)已被项目目录中的某个人使用 IntelliJ 修改并保存为 UTF-8。我只是从头开始导出并恢复备份文件,现在正在工作。 @Kayaman 感谢您的帮助!
      【解决方案4】:

      函数 getBytes 也接受一个 Charset 或只是具有所需编码的字符串。

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

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 1970-01-01
        • 2012-03-24
        • 2012-03-07
        • 2020-09-15
        • 2015-11-12
        • 2011-08-15
        • 1970-01-01
        相关资源
        最近更新 更多