1、Unicode
Unicode简单来说就是一种世界标准,这个标准是要用统一全世界字符在计算机上的表示方法,比如:英语字母、阿拉伯数字、汉字、日文、韩语等。在Unicode出现之前已经有很多标准了,如:美国ASCII、西欧语言中的ISO 8859-1 、 中国的 GB 18030等,Unicode的出现就统一了全世界字符在计算机上的表示方法,也就是Unicode可以表示美国ASCII、ISO 8859-1、GB 18030等标准所表示的字符。例如:大写英文字母A,其ASCII值为97,如果用Unicode表示则是\u0041。
Unicode使用十六进制来表示,采用两个字节表示一个字符,两个字节就是16位长度的二进制,如果不考虑符号位则最大可以表示 2的16次方即65536个码点(两个字节的二进制最小和最大值是:00000000000000001111111111111111即065535,共65536个数),码点是指Unicode编码表中一个字符所对应的代码值。
其实,65536的码点并不能表示全世界的字符,于是Unicode就增补了一部分字符,目前的Unicode分为17组编排,每组称为平面(Plane),而每平面拥有65536个码点,最初的65536个字符在0号平面,增补的字符大多在1号平面,1号平面的字符就需要四个字节进行存储,目前很多平面还没有使用。
说到这里可以知道,Unicode就是一个字符集,这个字符集旨在统一全世界的所有字符,基本的字符用十六进制两个字节来表示,两个字节最多表示65536个码点,不能表示全世界的所有字符,于是就增补了一些码点,增补的码点需要四个字节来表示。
2 char
Char是Java语言的一种数据类型,Char和Unicode有什么关系呢?Char类型采用Unicode编码在计算机内存中表示每个字符。
我们知道Unicode编码是十六进制数,如果我们在编写程序时用十六进制表示字符是非常不方便的,谁去记每个字符所对应的Unicode十六进制是什么,所以在Java程序中Char类型的数据可以用单引号扩起来一个字符来直接表示 ,例如:’A’,’B’,’攀’,’博’,虽然程序中这样表示,其实Java虚拟机本身还是会以Unicode编码来表示字符,只是你看不到。
既然Char类型采用Unicode编码,单引号中即可以是单个字符也可以是Unicode编码(十六进制),Unicode编码采用‘\u’加十六进制的方式表示,比如:’\u0041’、‘\u0042’,它们分别表示’A’、’B’ 。
Unicode基本字符采用十六进制两个字节表示,一个Char类型的字符占用两个字节,所以一个Char类型的数据可以表示Unicode两个字节的基本字符,但是无法表示Unicode增补的字符,因为这些增补字符占四个字节。
3 UTF-8
Unicode统一编码在计算机具体实现时还存在问题,比如用两个字节来表示ASCII字符, 由于ASCII只占一个字节,这样第一字节的8位始终为0,这就造成了比较大的浪费。
解决上边的问题就要对Unicode进行格式转换,这里可以使用UTF-8编码对Unicode进行格式转换,UTF即Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF),UTF-8是一种变长编码,它将基本7位ASCII字符用7位编码表示占用一个字节(首位补0),当遇到需要多个字节存储时将按一定算法转换,每个字符可以使用1-3个字节编码。如下:字符A的Unicode为00000000 01000001,转换为UTF-8编码则是01000001,可以看出用UTF-8转换编码后存储空间节省了。
除了UTF-8还有UTF-16、UTF-32,UTF就是把Unicode编码映射为N位长的整数序列,用于数据存储或传递。
UTF-16是每个字符用16位表示,16位称为一个代码单元 ,在 Java 中,char 类型描述了 UTF-16 编码中的一个代码单元,char类型采用UTF-16编码。
总结:Unicode是一个字符集,用十六进制定义了全世界的字符,UTF-16是Java中Char类型的编码格式,UTF-8是当前互联网中使用最广的编码。
关于Java char和Unicode和UTF-8的详细内容请参考:http://www.pbteach.com/post/javase/grammar_datatype/