java中char到底占几个字节的问题

前些天被问到一个问题:java中一个char可以表示一个汉字吗?
我一想char不是占一个字节吗?汉字在utf-8中占三个字节(还有四字节的),char不能够表示!对方一笑,让我后面查查
所以网上搜了一些资料查查,并做一个例子:

public class BytesOfChar {
    public static byte[] getBytesUTF8 (char  c ) {
        Charset cs = Charset.forName("utf-8");
        CharBuffer cb = CharBuffer.allocate (1);
        cb.put (c);
        cb.flip ();
        ByteBuffer bb = cs.encode (cb);
        return bb.array();
        }
    public static byte[] getBytesGBK (char c) {
        Charset cs = Charset.forName("GBK");
        CharBuffer cb = CharBuffer.allocate (1);
        cb.put(c);
        cb.flip ();
        ByteBuffer bb = cs.encode (cb);
        return bb.array();
        }
   public static void main(String[] args) throws UnsupportedEncodingException {
       char c='a';
       char cc='中';
       String str="a";
       String strr="中";
       String s="a";
       System.out.println("编码为UTF8:");
       System.out.println("char值为英文字符所占字节长度:"+getBytesUTF8(c).length);
       System.out.println("char值为中文字符所占字节长度:"+getBytesUTF8(cc).length);
       System.out.println("编码为GBK(默认编码):");
       System.out.println("char值为英文字符所占字节长度:"+getBytesGBK(c).length);
       System.out.println("char值为中文字符所占字节长度:"+getBytesGBK(cc).length);
       System.out.println("-------------------------------");
       System.out.println("编码为UTF8");
       System.out.println("String为英文字母所占字节长度:"+str.getBytes("utf-8").length);
       System.out.println("String为中文字母所占字节长度:"+strr.getBytes("utf-8").length);
       System.out.println("编码为GBK:");
       System.out.println("String为英文字母所占字节长度:"+str.getBytes("GBK").length);
       System.out.println("String为中文字母所占字节长度:"+strr.getBytes("GBK").length);
       System.out.println("String为英文字母(全角)所占字节长度:"+s.getBytes("GBK").length);

}
}
运行结果:
编码为UTF8:
char值为英文字符所占字节长度:1
char值为中文字符所占字节长度:3
编码为GBK(默认编码):
char值为英文字符所占字节长度:2
char值为中文字符所占字节长度:2
-------------------------------
编码为UTF8
String为英文字母所占字节长度:1
String为中文字母所占字节长度:3
编码为GBK:
String为英文字母所占字节长度:1
String为中文字母所占字节长度:2
String为英文字母(全角)所占字节长度:2

首先看char所占字节数,从上面可以看出一个char是可以表示一个中文字符的,而且所占的字节数和编码方式有关:
在uft8编码下占三个字节;
在GBK编码下占2个字节;
但是如果 char表示英文字母:
在uft8编码下占一个字节;
在GBK编码下还是占2个字节;
所以char类型的值不管是英文还是中文都是统一两个字节!
可能这样做的原因是因为采用Unicode(两个字节)可以表示所有的字符,这样一个char类型就可以表示所有的单个“字符”,也就是所说的char。而对于utf8编码下字节数是进行转换的。
———————————————————————————————————_
但是对于字符串中单个字符则就不一样了,根据指定的编码utf8字符串在中文和字母下输出可以理解,但是在GBK下英文字母占一个字节,这个应该是不包含的;这里首先要区分半角与全角:在GBK下,都是采用全角(两个字节表示),而我这里str=”a”;中的a是半角输入,也就是ASCII码,而在全角下s=”a”是占两个字节的。所以str=”a”中的只占一个字节的a并不是GBK中的a,一个是半角一个是全角(请看最后一行输入)。即GBK中也有字母数字,不过那些字母数字(全角,不过很少用)是占两个字节,和我们正常用输入法输入的半角字符不一样。

你可能感兴趣的:(java)