写这短文之前想问大家一个问题,String 类型是什么编码?那char呢?
其实,记住一句话就行了,String 和char 都是unicode编码!!!底层的虚拟机和框架只能直接操作unicode编码。String= char[]常量+方法。所以,char的编码就是String的编码。开始学java的时候,第一节课,就告诉我们 java的字符编码是unicode编码。所以我们初始化char变量的时候,只能将unicode编码赋值给char.
例如 char c=’编';char c=(char)0x7f16 。还好,大部分编码前128个字符都是一样的,也就是ASCII的前128个字符。char c=(char)65;
下面说说字符编码转换
字符编码转换的基本原理是这样的,先将原始编码转unicode编码,再转成目标编码。
比如一个utf-8编码的字节数组 byte[] bytes,先是String s=new String(bytes,“utf-8”);//用utf-8编码的字节数组初始化一个unicode编码的字符串。byte[] newBytes=s.getBytes("gb2312");//得到gb2312编码的字节数组。如果本身就是一个字符串了,就直接getBytes成目标编码就行了。如果是从网络上得到数据byte[],一定要在new String设置编码类型。如果得到的目标编码不对,那一定是字符串初始化不对。
如果有人说,怎么将utf-8的字符串(String)转成gb2312的字符串,你直接上去给他几巴掌,String本身就是unicode编码,哪里来utf-8的字符串。好了,utf-8 gb2312都是对于字节数组来说的。
C#的也是一样的原理。