在书的前面部分我们已经看过了Unicode和UTF-16的相关介绍,简单的来说Unicode就像是一本字典,这本字典中的内容就是一个个符号和对应的数字1(码点),他没有编码的功能。而UTF-16是一种编码规则,他会根据Unicode 这本字典中的数字1来产生对应的数字2,这一步操作的目的是因为经过这样的转换数字2比数字1方便了某些事情,比如平台之间软件移植和计算机计算等。
说完了他们连个之间的关系再来说说数字1和数字2之间的不同。Unicode这本字典只有17页,这17页中第1页是叫做“基本多语言平面”,而剩余的16页就都是一些偏僻字符,他们统一叫做辅助字符。在数字2的逻辑中我们用16位的二进制来表示字典中第一页的字符(基本多语言平面),这16位组成一个代码单元,而剩余的16页我们用两个代码单元来表示,有人可能会有疑问不会发生冲突么?答案是不会,因为在16位表示基本多语言平面中有部分范围是没有表示字符的,这部分我们叫做替代区域,而使用这个替代区域中的值两两组合就可以表示剩下16页的字符了(具体如何实现请自行查找资料,以上只是简单描述,为了让大家理解方便)。
码 点:一一对应
代码单元:一一对应 + 两两组合
这里对indexof()这个方法具体的功能不做论述了,有书的朋友可以翻到P50页或者阅读这个网页中的内容Java API文档。
接下来展示代码,能更方便的结合书理解这个方法的用处。
代码:
public static void main(String[] args){
String sentence = "\uD835\uDD46 is"; //这个字符串一共用4个字符,四个码点,五个代码单元。第一个字符请看下方链接
int cp0 = sentence.codePointAt(0);
int cp1 = sentence.codePointAt(1);
int cp3 = sentence.codePointAt(3);
System.out.println("字符串:" + sentence);
System.out.println("字符串长度:" + sentence.length()); //length()方法得到5
System.out.println("第一个代码单元的序号:" + cp0);
System.out.println("第二个代码单元的序号:" + cp1);
System.out.println("第四个代码序号:" + cp3); //codePointAt()方法得到的是从一开始算第四个表示的字符的序号,及i
System.out.println("120134第一次出现的位置:" + sentence.indexOf(120134));
System.out.println("56646第一次出现的位置:" + sentence.indexOf(56646));
System.out.println("105第一次出现的位置:" + sentence.indexOf(105));
}
字符串: is
字符串长度:5
第一个代码单元的序号:120134
第二个代码单元的序号:56646
第四个代码序号:105
120134第一次出现的位置:0
56646第一次出现的位置:1
105第一次出现的位置:3
第一个字符介绍(‘\uD835\uDD46’):符号信息。
length()方法介绍:length()方法介绍。
Unicode code units介绍:上面length方法页面中的链接(看完上面的连接后不要拉下,有助于理解)。
码点和代码单元的介绍:csdn内关于码点和代码单元的介绍(结合上一个链接看)。
codePointAt()方法介绍:codePointAt()方法介绍。