在Java?Core?卷1中?對(duì)Char的描述如下
在設(shè)計(jì)Java時(shí)決定采用16位的Unicode字符集....(中間省略)... 現(xiàn)在16位的Char類型已經(jīng)不能滿足描述所有Unicode字符的需要了。
Java為了解決這個(gè)問(wèn)題的方法是使用碼點(diǎn)和代碼單元
代碼點(diǎn)(Code Point):在 Unicode 代碼空間中的一個(gè)值,取值 0x0 至 0x10FFFF,代表一個(gè)字符。
代碼單元(Code Unit):在具體編碼形式中的最小單位妙真。比如 UTF-16 中一個(gè) code unit 為 16 bits,UTF-8 中一個(gè) code unit 為 8 bits。一個(gè) code point 可能由一個(gè)或多個(gè) code unit(s) 表示蕉鸳。在 U+10000 之前的 code point 可以由一個(gè) UTF-16 code unit 表示,U+10000 及之后的 code point 要由兩個(gè) UTF-16 code units 表示
——引用自@柳東原
在Java中,char類型描述了UTF-16編碼中的一個(gè)代碼單元
額潮尝,粗略的看了幾份資料后榕吼,我的大概理解是這樣的
碼點(diǎn):就是某個(gè)任意字符在Unicode編碼表中對(duì)應(yīng)的代碼值
代碼單元:是在計(jì)算機(jī)中用來(lái)表示碼點(diǎn)的,大部分碼點(diǎn)只需要一個(gè)代碼單元表示勉失,但是有一些是需要兩個(gè)代碼單元表示的羹蚣。
下面實(shí)際操作體驗(yàn)一番
"??"?這個(gè)數(shù)學(xué)符號(hào)碼點(diǎn)?為U+1D546?在? Java中的代碼單元為? U+D835?和U+DD46
String word = "\uD835\uDD46";
System.out.println("字符為:"+word + " String.length(): "+ word.length());
打印結(jié)果如下(String.length()返回的是字符串代碼單元的長(zhǎng)度)。
字符為:?? String.length(): 2
而且char類型無(wú)法放下這個(gè)符號(hào)
//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("第一個(gè)單元:" + firstUnit + " 第二個(gè):" + secondUnit + " 碼點(diǎn):" +codePoint);
打印結(jié)果??
第一個(gè)單元:d835 第二個(gè):dd46 碼點(diǎn):1d546