前言
最近开始了《Java核心基础:卷一》的阅读,读到了代码点这一知识点有点懵,于是开始网上搜各种帖子,然后记录下自己的理解
代码
public class Test2 {
public static void main(String[] args) {
String s = "\uD835\uDD6B";//𝕫占用两个字符,length=2
//String s1 = "\uD835";//?占用一个字符,length=1
//String s2 = "\uDD6B";//?占用一个字符,length=1
//String s = "中";//中占用一个字符,length=1
System.out.println(s);
System.out.println(s.length());//2
System.out.println(s.codePointCount(0,s.length()));//1
}
}
解释
一个char字符占用两个字节,一共8位(bit),一共有65535个字符
常见文字用一个char存储,占用一个字符/两个字节,高八位低八位都用
常见英文字用一个char存储,占用一个字符/两个字节,但是只占用低八位
但是世界上这么多文字/符号,单纯的一个字符(65535)肯定是装不下的
这就意味着有些文字和特殊符号,需要用两个甚至多个字符表示
此时就用引入了代码点和代码单元
一个字符为一个代码单元CodeUnit
我们能识别的文字符号都是有对应的代码点CodePoint的。
一个代码单元构成的代码点是基本字符的编码,如:z,中
多个代码单元构成的代码点是辅助字符的编码,如:𝕫
只打印辅助字符的单个字符会出现乱码
只打印文字的单个字节也会乱码
IO流中有每次读写一个字节的方法,当读取到一个字节马上打印输出这个字节
文本文件就会乱码。英文则不会乱码)
所以,所有的文字和符号在底层都是由代码单元CodeUnit存储的(最底层是字节,也就是0和1)
但是计算机可以通过特定的规则(各种编码表)识别出代码点(无论是一个代码单元构成还是多个代码单元构成)
进而表示出我们能识别的文字和符号。