编码问题

大家好,请教个问题:

String s="abc你好";

byte[] by=s.getBytes();

输出by.length();

在系统默认编码为GBK是输出7;
在系统默认编码为utf-8时输出9;

我的疑问:
(1)"abc你好"保存为gbk源码时,"abc"各一个字节,"你好"各两个字节,共7个字节,而保存为utf-8源码时,"abc"各一个字节,"你好"各3个字节,共9字节,这些我都能理解。

      (2)但是源程序被编译成字节码后,s到了java程序中,都是以unicode编码标识的,每个字符是2个字节,s.getBytes()是怎样把s编成字节数组的呢,是针对的unicode编码呢,还是默认编码呢?如果是针对unicode,怎么会在不同默认编码下有不同结果呢?如果是针对默认编码,但程序执行的是字节码,源文件都被编译了,干嘛还针对默认编码呢?

唉,糊涂了!

请详细解释一下!最好是对编码过程有个介绍,谢谢!

java内部是使用char类型来处理字符串的,使用String.toCharArray() 返回的长度都是一样的

1.编译程序在读.java文件的时候会已一定的编码读取比方说GBK/UTF-8
类似String s=new String(byteArrayFromFile,"GBK") 对GBK文件,"abc你好"为7个byte
String s=new String(byteArrayFromFile,"UTF-8") 对UTF-8文件,"abc你好"为9个byte
不管哪种方式读进来,都是用char[]cs=s.toCharArray()表示,其长度都是5

2.编译后在写.class文件时内
byte[] bs=String.getBytes("UTF-8");//.class文件内部使用的是UTF-8的byte []保存字符串. "abc你好"为9个byte
outputStream.write(bs);

所以针对相同内容不同编码的文件,其编译之后的结果是一样的。

默认编码应该在进行String类操作的时候会用到
比方说从byte[] -> String 或者 String -> byte[]
最简单的列子就是从文件读取字符串,一定要指定编码,否则不同环境下的默认编码不同会导致结果不同.

在内存里java都是unicode编码,但是getBytes(),它会根据java文件编码进行转码的。
你看下getBytes()里的实现就会知道了