守着一只汪
public byte[] getBytes(String charsetName)使用指定的字符集将此String编码为byte序列,结果存在一个byte数组中public String(byte[] bytes, String charsetName)通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。在网络传输中,信息都是以字节序列的方式传输的。所以,发送方的String要按照某种编码方式(如UTF-8,GBK)编码为字节序列,在网络中传输后,接收方取得这个字节序列,按照相同的编码方式将字节序列解码为String。请看下面的代码片段:String name = "张三";byte[] b1 = name.getBytes("UTF-8");String name1 = new String(b1, "UTF-8"); //编码解码相同,正常显示System.out.println(name1);String name2 = new String(b1, "GBK"); //编码解码不同,乱码System.out.println(name2);byte[] b2 = name.getBytes("GBK");String name3 = new String(b2, "GBK"); //编码解码相同,正常显示System.out.println(name3);String name4 = new String(b2, "UTF-8"); //编码解码不同,乱码System.out.println(name4);至于你的那个情况,要先用gbk编码,然后再用utf-8解码才能获得正常的字符串,我估计是因为1.传输过来的字节码是用utf-8编码的,假设字节码为b。2.你获得的那个字符串,假设为s,是用gbk对b进行解码获得的字符串,所以是乱码。3.你使用gbk对s进行编码,用gbk解码之后再编码,于是获得了原来的b。4.你使用utf-8解码,所以获得了正常的字符串。简单的说: b -> (gbk解码) -> 乱码 -> [此处开始是你做的](gbk编码) -> b -> (utf-8解码) -> 正常字符串研究完编码收获会不小的,对以后理解Java的输入输出(尤其是网络通信和文件读写)都很有帮助。