书上说
如果数据库里使用的是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来编码的。我的理解错在哪里?

解决方案 »

  1.   

    这里面是两个过程
    有个 编码 解码的概念
    详细可以看看我blog里写的
    http://blog.csdn.net/dongfengsun
      

  2.   

    看了你的文章,感觉还没有解决我的问题
    我的问题是你从数据库里获得字节流,并转换成Java中的String的时候
    其实java已经把这些字节编码转换成了Unicode了,那么我觉得这个时候可以直接再转换成
    GBK,为什么还要s.getBytes("ISO-8859-1")
      

  3.   

    其实java已经把这些字节编码转换成了Unicode了
    ------------------------------------------------------
    应该是没有转换的,只是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。
      

  4.   

    楼上说的比较正确我的理解是这样的:ISO-8859-1每个字符都是一个字节的,所以读取GBK字节流的时候也是按字节读取的,不会丢失信息,然后java在转换成unicode时,只是再前面补一个字节 0x00。
    s.getBytes("ISO-8859-1")又把这些字节流原封不动的还原了,所以才能再转换成GBK而如果把这里的ISO-8859-1换成其他编码比如:UTF-8或者UTF-16就不能这样做了。
    因为用UTF-8或UTF-16读取GBK的时候会丢失字节信息。做了试验的确是这样,不知我的理解是否正确
      

  5.   

    String s=new String(s.getBytes("GB2312"));