日期:2014-05-17  浏览次数:20707 次

请教关于String和Byte[]转化原理。。
想弄清楚编码的转化问题,查了好多帖子都不太能理解,特来求助

首先对于这一句
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的存储方式的理解出错了
求解答,感激不尽

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