编码困难

时间:2016-08-18 05:35:05

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

我正在使用我正在处理的代码遇到一些编码问题。接收加密的字符串,用ISO-8859-1解码。然后将此字符串放入具有UTF-8编码的DB中。当检索到这个字符串时,它仍然是ISO-8859-1,并且没有问题。问题是我还需要能够将此字符串检索为UTF-8,但我还没有成功。

使用此方法从数据库检索时,我尝试将字符串从ISO转换为UTF-8:

private String convertIsoToUtf8(String isoLatin) {
    try {
        return new String(isoLatin.getBytes("ISO_8859_1"), "UTF_8");
    } catch (UnsupportedEncodingException e) {
        return isoLatin;
    }
}

不幸的是,在这种情况下,特殊字符只显示为问号。

原始字符串:测试æøå 从DB恢复并转换为UTF-8后的输出示例:测试???

更新:阅读评论中提供的链接后,我设法做到了。由于数据库已经是UTF-8编码,我需要做的就是:

return new String(isoLatin.getBytes("UTF-8"));

1 个答案:

答案 0 :(得分:3)

当你已经拥有String - 对象时,纠正任何编码问题通常为时已晚,因为某些信息可能已经丢失 - 想想无法一对一映射到的字符到java的内部UTF-16表示。

处理字符编码的正确位置是你获得字符串的那一刻:从文件中读取输入(在InputStreamReader上设置正确的编码),转换你获得的byte[]时解密,从数据库读取时(这应该由您的JDBC驱动程序进行处理)等。

执行反向操作时也要注意正确处理编码。虽然在大多数情况下使用默认编码时似乎可以正常工作,但您可能迟早会遇到难以解决的问题(正如您现在所做的那样)。

PS:还要记住用于显示输出的工具:某些控制台不会显示UTF-16或UTF-8,请检查用于查看文件的编辑器的编码设置等。您的输出可能是正确的,只是无法正确显示。