从语言编码的角度,getBytes(charset)不是解码、也不是编码,是转换。API 说的是针对数据的角度。把一个整体的String分解成byte[]了。
byte[] b2=s.getBytes("gbk");
String ss=new String(b2,"utf-8");
从GBK转换成UTF-8。
UTF8包含更多的文字量。
byte[] b2=s.getBytes("gbk"); 表示按照gbk进行解码。
String ss=new String(b2,"utf-8");表示按照utf-8重新编码
utf-8是包含中文的,utf-8包含所有的字符
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的输入输出(尤其是网络通信和文件读写)都很有帮助。