java编码困难
我正在处理的代码有一些编码问题。接收加密字符串,并使用ISO-8859-1进行解码。然后将该字符串放入具有UTF-8编码的DB中。当检索到这个字符串时,它仍然是ISO-8859-1,并且没有问题。问题是我还需要能够以UTF-8的形式检索这个字符串,但我在这方面还没有成功
当使用以下方法从DB检索时,我尝试将字符串从ISO转换为UTF-8:
private String convertIsoToUtf8(String isoLatin) {
try {
return new String(isoLatin.getBytes("ISO_8859_1"), "UTF_8");
} catch (UnsupportedEncodingException e) {
return isoLatin;
}
}
不幸的是,在本例中,特殊字符仅显示为问号
原始字符串:Testæå 从DB检索并转换为UTF-8后的输出示例:测试
更新:在阅读了评论中提供的链接后,我成功地把它弄对了。因为DB已经是UTF-8编码的,所以我需要做的就是:
return new String(isoLatin.getBytes("UTF-8"));
# 1 楼答案
当您已经有了一个
String
-对象时,纠正任何编码问题通常都为时已晚,因为有些信息可能已经丢失了-想想那些无法一对一映射到java内部UTF-16表示的字符处理字符编码的正确位置是您获取字符串的时刻:从文件读取输入时(在
InputStreamReader
上设置正确的编码)、转换从解密获得的byte[]
时、从数据库读取时(这应该由JDBC驱动程序处理)等等在进行反向操作时,还要注意正确处理编码。虽然在大多数情况下,当您使用默认编码时,它似乎可以正常工作,但您可能迟早会遇到难以解决的问题(就像您现在所做的那样)
注意:还要记住您使用什么工具来显示您的输出:一些控制台不会显示UTF-16或UTF-8,请检查用于查看文件的编辑器的编码设置等。有时您的输出可能是正确的,只是无法正确显示