结论
java中的char是用UTF-16储存字符的。
Java的char大部分情况下是两个字节(有时是4个字节,如表示emoji)。
Unicode是字符集,不是编码,作用类似于ASCII码。
Java String字符串的length不是字符数而是字节个数(有字节序的加上字节序的字节个数)。
在Java(其中主要包括在JVM中、内存中、在代码里声明的每一个char、String类型的变量中。)中字符只以一种形式存在,那就是Unicode,不选择任何特定的编码,直接使用它们在字符集中的编号,这是统一的唯一的方法。
在JVM内部,统一使用Unicode表示,当着字符从JVM内部移动到外部时(即保存为文件系统中的一个文件内容时),就进行了编码转换,使用了具体的编码方案。因此也可以说,所有的编码转换只发生在边界的地方,也就是各种输入/输出流的起作用的地方。
概念:
1、位
位是计算机存储的最小单位,简记为b,也称为比特(bit)计算机中用二进制中的0和1来表示数据,一个0或1就代表一位。位数通常指计算机中一次能处理的数据大小;2、比特
比特(bit)是由英文BIT音译而来,比特同时也是二进制数字中的位,是信息量的度量单位,为信息量的最小单位;
3、字节
字节,英文Byte,是计算机用于计量存储容量的一种计量单位,通常情况下一字节等于八位,字节同时也在一些计算机编程语言中表示数据类型和语言字符,在现代计算机中,一个字节等于八位;
4、字
字是表示计算机自然数据单位的术语,在某个特定计算机中,字是其用来一次性处理事务的一个固定长度的位(bit)组,在现代计算机中,一个字等于两个字节。
字节、字、位、比特之间的关系是:1位=1比特;1字=2字节;1字节=8位;1字=16位。
计算机中的存储单位有:bit、B、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB等。
单位相互之间的换算关系入下:
1 Byte(B)= 8 bit; 1 Kilo Byte(KB) = 1024B; 1 Mega Byte(MB) = 1024 KB; 1 Giga Byte (GB)= 1024 MB; 1 Tera Byte(TB)= 1024 GB 等等。
5、字符集:
计算机只认识“0101”这样的数字,为了在计算机上表示人类所认识的字符,就需要有明确的转换规则,于是便有了字符集。
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。(编码:将一种规则下的字符转成另外一种规则下的字符的过程。(将人类所认识的字符,通过某种规则变成计算机能够识别的文字的过程叫做编码)。字符:人类所能识别的单个的个体,叫做字符。比如每一文字就是一个字符、一个表情符号、一个字母等不可再拆分的单体)
6、 ASCII字符集
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII最初是美国国家标准,后成为国际标准。1个字节表示1个字符。
7、 Unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode只是一个符号集,它只规定了每个
Unicode是容纳世界所有文字符号的国标标准编码,使用四个字节为每个字符编码。使用这种等宽编码存储 会非常浪费空间,尤其是以英语为母语的国家,人家也就几十个字母和符号,每个字符却都要用3个字节存储太浪费。所以才有了UTF的编码方案。
所以在我们的认知种的事物 -> 字符集 -> 计算机存储,从我们的认知到字符集可以有两种对应方式ASCCII码和Unicode码。
8、UTF
UTF是英文 Unicode Transformation Format 的缩写,意为把 Unicode 字符转换为某种格式。
UTF系列编码方案(UTF-8、UTF-16、UTF-32)均是由 Unicode 编码方案衍变而来,以适应不同的数据存储或传递,它们都可以完全表示 Unicode 标准中的所有字符。
目前,这些衍变方案中 UTF-8 被广泛使用,而 UTF-16 和 UTF-32 则很少被使用。
8.1 UTF-8
UTF-8 使用1至4个字节为每个字符编码,其中大部分汉字采用三个字节编码,少量不常用汉字采用四个字节编码。相对来说,英文多的文本,采用UTF-8更省空间(多数为1个字符)。
- 使用 1 ~ 4 个字节变长编码表示「1,112,064」个 Unicode 码点(码点是指一个编码表中的某个字符对应的代码值)
- 兼容 ASCII
- 码点数值越小,使用的字节数越少,出现的频率越高
8.2 UTF-16
使用二或四个字节为每个字符编码,其中大部分汉字采用两个字节编码,少量不常用汉字采用四个字节编码。如果汉字比较多的文本,采用UTF-16会比UTF-8更省空间。
8.3 UTF-32
UTF-32 使用四个字节为每个字符编码,使得 UTF-32 占用空间通常会是其它编码的二到四倍。
char如何储存UTF-8的字符?
而UTF-8一般是1到4个可变字节
比如此处字符‘庆’,使用在char中占据两个字节,但是在UTF-8中占据了3个字节。
其实char存储的是UTF-16,UTF-16一般使用为2或者4个字节为每个字符编码。(Java的char大部分情况下是两个字节,有时是4个字节,如下表示emoji表情符号)。
字符串的长度问题:如下图:字符串的长度指字节的个数,所以字符串长度不等于字符数。
字节序:字节在计算机中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。
String类型的“A”使用UTF-16编码时要用两个字节作为字节序,而char类型的’A’用UTF-16存储时是2个字节,不需要加字节序?