书上说
如果数据库里使用的是ISO-8859-1,那么要正确显示中文,要把它转换为GB2312
应该用 String s=new String(s.getBytes("ISO-8859-1"),"GB2312");我很疑惑
JDK文档里对getBytes的解释是:
Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.
把这个string编码成指定的这个编码的字节数组。
我理解是因为java中String都是Unicode的,所以用这个方法可以把这个String转换成使用其他编码组成的字节数组。并且我认为new String(byte[],charset)的意思是指定的这个byte数组中的字节是按指定的这个charset来编码的。我的理解错在哪里?
如果数据库里使用的是ISO-8859-1,那么要正确显示中文,要把它转换为GB2312
应该用 String s=new String(s.getBytes("ISO-8859-1"),"GB2312");我很疑惑
JDK文档里对getBytes的解释是:
Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.
把这个string编码成指定的这个编码的字节数组。
我理解是因为java中String都是Unicode的,所以用这个方法可以把这个String转换成使用其他编码组成的字节数组。并且我认为new String(byte[],charset)的意思是指定的这个byte数组中的字节是按指定的这个charset来编码的。我的理解错在哪里?
有个 编码 解码的概念
详细可以看看我blog里写的
http://blog.csdn.net/dongfengsun
我的问题是你从数据库里获得字节流,并转换成Java中的String的时候
其实java已经把这些字节编码转换成了Unicode了,那么我觉得这个时候可以直接再转换成
GBK,为什么还要s.getBytes("ISO-8859-1")
------------------------------------------------------
应该是没有转换的,只是java认为这些字节是Unicode了,但你直接用Unicode显示肯定乱码。
比如
在数据库里的ISO-8859-1编码是1100111011110001的ISO-8859-1编码
取出后就是1100111011110001,不会变成对应的Unicode的String s=new String(s.getBytes("ISO-8859-1"),"GB2312");
是告诉java该字符串是ISO-8859-1编码的,要转换为GB2312。
s.getBytes("ISO-8859-1")又把这些字节流原封不动的还原了,所以才能再转换成GBK而如果把这里的ISO-8859-1换成其他编码比如:UTF-8或者UTF-16就不能这样做了。
因为用UTF-8或UTF-16读取GBK的时候会丢失字节信息。做了试验的确是这样,不知我的理解是否正确