Java中char占多少字节

-

有些人可能很纳闷,在看资料书的时候书上Java基础数据类型章节中明明写着char在Java中占两个字节,但是自己去实践的时候却发现英文字母只占一个字节,而中文占两个字节???为啥????

一、内码与外码

这里涉及到两个概念:内码(internal encoding)和外码(external encoding)
这个知乎回答里有很好的解释:https://www.zhihu.com/question/27562173/answer/37188642

所谓内码,是一门语言实现char或String类型时在内存内部使用的编码。
而Java是以UTF-16作为内存的字符存储格式的(《深入分析JavaWeb技术内幕》p64)
UTF-16是两字节定长编码的,几乎可以翻译世界上所有语言。因此Java内部内存中一个char是占两字节的,不论是英文还是中文。比如’a’和’你’都是占两字节的。

二、常用外码

至于外码,那是用于程序与外部交互时使用的编码。在这个过程中就可能涉及到很多编解码的操作。
常见编码有:ASCII码,UTF-8,GBK,GB2312,ISO-8859-1

在Java中读取、写入字符文件时可以指定字符编码集的,若不指定则会使用系统默认编码集。可以通过如下代码来获取系统默认编码集:

String defaultCharsetName = Charset.defaultCharset().displayName();
System.out.println("defaultCharsetName:" + defaultCharsetName);//获取默认编码字符

不同编码会导致字符编码后(外码)所占字节数是不同的。常见的有:
utf-8编码英文字符所占字节数:1
utf-8编码中文字符所占字节数:3

GBK编码英文字符所占字节数:1
GBK编码中文字符所占字节数:2

byte[] data1 = "Hello我是生产者".getBytes("utf-8");  

上面这段代码data1的length是:20 (5+5*3)
这是外码环境中,我们所看得到的环境中。
如果你读取的时候指定的是其他编码集就有可能导致乱码。
关于其他字符编程长度:https://www.zhihu.com/people/zhao-min-zm/activities

猜你喜欢

转载自blog.csdn.net/zhaominpro/article/details/79602714