在Java Core 卷1中 对Char的描述如下
在设计Java时决定采用16位的Unicode字符集....(中间省略)... 现在16位的Char类型已经不能满足描述所有Unicode字符的需要了。
Java为了解决这个问题的方法是使用码点和代码单元
代码点(Code Point):在 Unicode 代码空间中的一个值,取值 0x0 至 0x10FFFF,代表一个字符。
代码单元(Code Unit):在具体编码形式中的最小单位。比如 UTF-16 中一个 code unit 为 16 bits,UTF-8 中一个 code unit 为 8 bits。一个 code point 可能由一个或多个 code unit(s) 表示。在 U+10000 之前的 code point 可以由一个 UTF-16 code unit 表示,U+10000 及之后的 code point 要由两个 UTF-16 code units 表示
——引用自@柳东原
在Java中,char类型描述了UTF-16编码中的一个代码单元
额,粗略的看了几份资料后,我的大概理解是这样的
码点:就是某个任意字符在Unicode编码表中对应的代码值
代码单元:是在计算机中用来表示码点的,大部分码点只需要一个代码单元表示,但是有一些是需要两个代码单元表示的。
下面实际操作体验一番
"" 这个数学符号码点 为U+1D546 在 Java中的代码单元为 U+D835 和U+DD46
String word = "\uD835\uDD46";
System.out.println("字符为:"+word + " String.length(): "+ word.length());
打印结果如下(String.length()返回的是字符串代码单元的长度)。
字符为: String.length(): 2
而且char类型无法放下这个符号
//char c = '';
String word2 = "";
String firstUnit = Integer.toHexString(word.charAt(0));
String secondUnit = Integer.toHexString(word.charAt(1));
String codePoint = Integer.toHexString(word2.codePointAt(0));
System.out.println("第一个单元:" + firstUnit + " 第二个:" + secondUnit + " 码点:" +codePoint);
打印结果
第一个单元:d835 第二个:dd46 码点:1d546