下面大家请看我的代码,基本了解下,怎么得到字符串的unicode,utf-8编码,gbk编码,以及了解如何获取系统的默认字符集编码。

java解码与编码若干问题_第1张图片

java解码与编码若干问题_第2张图片


请看第9行代码就是怎么获取系统默认字符集,windows一般是gbk,linux一班是Utf-8.


对于初学者来说,最难理解的是,这么多编码,什么时候是用这个编码,什么时候是用那个编码,这也是我当时最头疼的事。


下面我们先了解下什么是编码什么是解码。

看我下一段代码:

java解码与编码若干问题_第3张图片


就2行关键代码。

可能大家还是有些疑惑,那么我来提几个问题,看大家能否回答。


String str="你好";

"你好"是以什么方式存在于内存呢?

unicode,在java中你没把字符串进行编码,那么他就是以Unicode方式存在于内存的。

怎么存放?

String 其实是一个char字符数组."你好"相当于2个长度的char数组来存放。

char 字符怎么存放,unicode,所以归根到底 String对象在你没对他进行编码的时候,他就是以Unicode存放于内存的.

有人可能对这一行有疑问

byte[] buf=str.getBytes();

他认为,这里我没对字符串进行编码啊,我只是要得到他的字节码的数组啊,为什么你说对他进行了”gbk“编码。是这样的,当你操作系统是windows的时候,你这样写就等于

bytep[] buf=str.getBytes("gbk");

当你调用字符串getBytes的方法时,你是一定会以一种不是unicode的字符集对字符串进行编码的。

只是你还没对这一点有清楚的认识。


String str=new String(buf,"gbk");

这个过程叫做解码。

buf数组里面存放了“你好”的gbk编码,现在我要创建一个String对象,这里要指出,你的String对象其实是char数组。char是以Unicode嘛存放字符的,所以要解码,把用其他编码方式的字节码数组,解码成Unicode的字符串。当然你后面解码的字符集,必须要和你编码时的字符集对应,否则不是乱套了。