《Java核心技术 卷Ⅰ》3.6.6
第一次接触到这两个名词,看了很多博客也没有找到浅显易懂的解释。综合书本以及各位网友的解释,做出我的解释
代码单元(Code Unit):
代码单元是计算机中存储和处理文本数据的最小单元。在计算机内部,文本通常以编码方式存储,而代码单元是编码中的基本单元。对于许多常见的字符集,一个代码单元通常对应一个字符。
在 Unicode 中,常见的编码方案如 UTF-8、UTF-16 和 UTF-32 中,代码单元的大小不同:
- UTF-8: 一个代码单元是8位,即一个字节。
- UTF-16: 一个代码单元是16位,即两个字节。
- UTF-32: 一个代码单元是32位,即四个字节。
需要注意的是,一些字符可能需要多个代码单元来表示,尤其是对于 Unicode 中的一些辅助平面字符。例如,在 UTF-16 编码中,一些字符可能需要两个代码单元(代理对)来表示。
码点(Code Point):
码点是 Unicode 中的基本字符抽象。每个字符都被分配一个唯一的码点,这是一个整数值。Unicode 码点的范围是从 U+0000 到 U+10FFFF。码点通常以十六进制表示,例如,字母 "A" 对应的 Unicode 码点是 U+0041。
不同的编码方案使用不同的方式来将码点编码成字节序列。例如,UTF-8、UTF-16 和 UTF-32 是常见的编码方案,它们分别使用不同大小的代码单元来表示码点。在这些编码方案中,一个码点可能由一个或多个代码单元组成。
1.作用:
- 代码单元: 代码单元是计算机内部存储和处理文本数据的基本单元。在编码方案中,文本字符被映射到一个或多个代码单元,而代码单元是实际存储在计算机内存中的单位。不同的编码方案使用不同大小的代码单元,例如 UTF-8 中的一个字节、UTF-16 中的两个字节、UTF-32 中的四个字节。
- 码点: 码点是 Unicode 中的基本字符抽象,每个字符都被分配一个唯一的整数值。码点是字符的标识符,是在字符集中的唯一位置。不同字符对应不同的码点,通过码点可以精确定位和标识字符。
2.区别:
- 代码单元与编码方案相关: 代码单元的大小取决于所使用的字符编码方案。在不同编码方案中,同一个字符可能由不同数量的代码单元组成。例如,UTF-8 中一个字符可能由一个到四个字节组成,而 UTF-16 中一个字符可能由一个或两个代码单元组成。
- 码点是字符的唯一标识: 码点是字符在 Unicode 中的唯一标识符。不同字符对应不同的码点,而码点是与具体编码方案无关的。同一个字符在不同的编码方案中可能对应不同的代码单元,但其对应的码点是不变的。
示例:
- 例子1 - UTF-8 编码:
-
- 字符 "A" 的 Unicode 码点是 U+0041。
- 在 UTF-8 编码中,字符 "A" 由一个字节(一个代码单元)表示,即 0x41。
- 例子2 - UTF-16 编码:
-
- 字符 "A" 的 Unicode 码点是 U+0041。
- 在 UTF-16 编码中,字符 "A" 由两个字节(两个代码单元)表示,即 0x0041。
总结一下:
- 代码单元是计算机内部用于存储和处理文本数据的最小单元,其大小取决于所使用的编码方案。
- 码点是 Unicode 中的基本字符抽象,是一个唯一的整数值,通常以十六进制表示。同一个码点在不同的编码方案中可能由不同数量的代码单元表示。
举个例子
Java中char数据类型采用UTF-16的方式编码,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。
length方法将返回采用UTF-16编码表示给定字符串所需要的代码单元数量。例如:
String greeting = "Hello";
int n = greeting.length(); // is 5
要想得到实际的长度,即码点数量,可以调用:
int cpCount = greeting. codePointCount(0,greeting.length());//is 5
要想得到第i个码点,应该使用下列语句
int index = greeting.offsetByCodePoints(0,i);
int cp = greeting.codePointAt(index);
运行示例如下