想弄清楚编码的转化问题,查了好多帖子都不太能理解,特来求助首先对于这一句
String s2= new String(s1.getBytes( "iso-8859-1"), "gb18030");最开始从别的帖子的说明,结合JDK的说明
我理解为  将字符串s1按照 iso-8859-1重新编码为字节数组  , 将这个字节数组以gb18030的方式重新存为s2
按照这么理解的话我就开始不明白了....
1  getBytes方法怎么知道s1原来以什么编码方式存储的,怎么做到将未知编码方式的s1重新编码为iso-8859-1的Byte[]的
2  对于构造函数String(Byte[] b, String charSetName )
   他怎么将各种不同编码的Byte[] 重新转储为 gb18030的Byte[]的然后又看到了另一个说法
1 getBytes("iso-8859-1") 代表 原来的获取的s1以iso-8859-1编码方式存放在内存中(原始的字节码是iso-8859-1编码)
                              然后按照这个编码方式转化为 unicode的字节码2 String(Byte[] b, String charSetName )  将原来是unicode字节码的Byte[] b ,转存为 charSetName编码的字节码但是这又和JDK说明
 Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.
    的不一样
感觉还是不对我觉得是不是我在String的存储方式的理解出错了
求解答,感激不尽

解决方案 »

  1.   

    String s2= new String(s1.getBytes( "iso-8859-1"), "gb18030");这句语句的语意是完全错误的。这么写的话会扣工资的!
    S1按ISO解码再按GB编码,肯定会出乱码。
      

  2.   

    这个不一定就会是乱码,
    这句话意思是先用iso-8859-1形式编码,然后再用gb18030解码。
    在java内部,吧string变成byte是编码过程,吧byte变成string是解码过程,java的内部字符编码都是utf-8的双字节变种(utf-8编码本身是三字节的)。
    而iso-8859-1其实是单字节原始编码,所以这句话根本含义其实是吧字符串还原成单字节原始码,然后再用gb18030的形式解码,在以前ie6的时候,浏览器提交中文,会使用gbk的形式编码传输,但是tomcat默认使用iso-8859-1完成解码,因此可以使用这句话用来解码,但是现在不用这样了,这个工作可以交给容器去完成的。
      

  3.   

    可以通过设置服务URI字符集来解决
      

  4.   


    你这是在误人子弟!
    UTF-8 是变长码,每个字符字节数1到3都可能。java String 使用 UTF-16 的一个版本。
    字符和字节的关系,看JDK的CodePoint 类,里面有简单介绍,以及衍生阅读材料的链接。
    编码问题实际相当复杂,不是一两句说的清的。网上很多BLOG的说法都有这样那样的错误。
    建议直接阅读http://www.unicode.org/ 官网上的标准。
      

  5.   

    我知道utf-8是变长码,他表示ascii字符的时候是一个字节,但是不管怎么说它表示中文的时候是3个字节,虽然我没遍历所有的中文情况,但是我所用过的中文都是这种情况。或许你说的对,但是我也是被某本书所误把,那书上是这么说的,后来我查看class文件的字节码,中文字符串确实是双字节。或许读取到内存会不一样,或者jdk的新旧版本不一样吧。
    你说编码很复杂,确实很复杂,我也知道一两句说不清楚,但是最主要的是,能解决眼下楼主的问题,而且我也是依靠我的理解解决问题的,而且问题解决了。
    最后说一句,我不教书育人,所以误人子弟这个大帽子,我还是担不起的,更何况牛顿用他的经典物理学误人子弟了几百年,谁也不能保证现在的相对论与量子力学不是误人子弟,所以谁的说法都会有错误,问题是你要说出你的观点,然后给个解决楼主问题更好方案。