关于Java核心技术书中的代码点和代码单元是怎么理解的呢?
发布网友
发布时间:2022-05-05 06:42
我来回答
共3个回答
热心网友
时间:2023-10-13 13:14
代码单元”是各个编码形式中的单个单元。代码单元的大小等效于特定编码的位数测量单位:
UTF-8 中的代码单元由 8 位组成。
UTF-16 中的代码单元由 16 位组成。
UTF-32 中的代码单元由 32 位组成。
GB18030 中的代码单元由 8 位组成。
每个代码点中的代码单元数
映射到代码点所需的代码单元数根据编码形式而有所不同:
UTF-8
在 UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元。
UTF-16
UTF-16 的代码单元大小是 8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中。
对于标量值大于或等于 U+10000 的代码点,每个代码点需要两个代码单元。在 UTF-16 中,这些代码单元对有一个独特的术语:“Unicode 代理对”。
热心网友
时间:2023-10-13 13:14
附上其中几个用到的API的使用方法,希望对楼主有用:
public int codePointCount(int beginIndex,
int endIndex)返回此序列指定文本范围内的统一代码点。文本范围始于指定的 beginIndex,并扩展到索引 endIndex - 1 上的 char。因此文本范围的长度(char 形式)为 endIndex-beginIndex。该序列中每个未配对的代理项都被作为一个代码点进行计数。
public int offsetByCodePoints(int index,
int codePointOffset)返回此 String 中从给定的 index 处偏移 codePointOffset 个代码点的索引。文本范围内由 index 和 codePointOffset 给定的未配对代理项各计为一个代码点。
int codePointAt(int index)
返回指定索引处的字符(Unicode 代码点)。
热心网友
时间:2023-10-13 13:15
String greeting = "Hello";
int n = greeting.length();//求出字符串“Hello”的字符数=5
int cpCount =greeting.codePointCount(0,greeting.length());//返回greeting的指定文本范围中的 Unicode 代码点数。
char first =greeting.char(0);//起始字符是H
char last = greeting.char(4)//第五个字符是o
int index =greeting.offsetbyCodePoints(0,i);// 返回此greeting中从给定的0处偏移i个代码点的索引
int cp = greeting.codePointAt(index); //回指定索引处(上面的index)的字符(Unicode 代码点)。