为什么 string要设计成 final , 又如何设计一个不可变类呢?留下了一个编码相关的问题 。在java中 , 一个字符(汉字字母)理论上占用两个字节 。但在utf-8 , 新字符串(“单词”) 。getbytes 。length返回3 , 这意味着3个字节 。你知道为什么吗?java中char占用多少字节?
在回答这个问题之前 , 我们先学习一些基础知识 。
什么是字符集?什么是编码?
字符(character)是文字与符号的总称 , 包括文字、图形符号、数学符号等 。一组抽象字符的集合就是字符集(charset) 。
之所以说“抽象” , 是因为这里说的人物是没有具体形式的人物 。比如文章里看到的“韩”这个人物 , 其实就是这个人物的一个具体表现 , 就是它的形象表现 。当人们读“韩”这个词时 , 他们使用另一种具体的表现形式——声音 。但无论如何 , 这两种表达方式指的是汉字 , 同一汉字可能有无数种表达方式(点阵、矢量法、音频等) 。).如果每个表达式中的相同字符包含在字符集内 , 会使字符集过大 。对于因此抽象字符集中的字符 , 都是指唯*存在的抽象字符 , 而忽略了它的具体表现形式 。在给定一个抽象字符集合中的每个字符都分配了一个整数编号之后 , 这个字符集就有了顺序 , 就成为了编码字符集 。同时 , 这个编号 , 可以唯*确定到底指的是哪一个字符 。,的同一个字符 , 不同字符集编码系统指定的整数是不同的 。例如 , 单词“er” , 在unicode中 , 它的数字是0x513f , 这意味着它是unicode中的第一个0x513f字符 。在另一个编码字符集中 , 单词是0xa449 。
编码字符集 , 指的是这种被分配了整数编号的字符集合 , 但是编码字符集中字符被分配的整数编号 , 不一定就是该字符在计算机中存储时所使用的值 , 计算机中存储的字符到底使用什么二进制整数值来表示 , 由字符集编码决定 。
在字符集编码决定了如何将一个字符的整数编号对应到一个二进制的整数值 。,几乎所有英文字符的字符集代码中 , 英文字母的整数数字与计算机中存储的二进制形式一致 。但是有些编码方法 , 比如适用于unicode字符集的utf-8 , 是将大量字符的整数进行转换 , 存储在计算机中 。例如 , “中文”的unicode值是0x6c49 , 但其编码格式是utf-8 , 其值是0xe6b189 (3字节) 。
编码字符集里的每一个字符 , 都对应到唯*的一个代码值 , 这些代码值叫做码点(codepoint) , 可以看做是这个字符在编码字符集里的序号 , 字符在给定的编码方式下的二进制比特序列称为码元(codeunit) 。
注意:我们在这里引出了两个概念 , 码点和码元 。
为什么要区分字符集和编码?
早期字符集和编码是一对一的 。字符编码方案很多 , 一个字符集只有一种编码实现 , 两者一一对应 。比如gb2312 , 在这种情况下 , 不管怎么称呼 , 比如“gb2312代码”和“gb2312字符集” , 其实都是一样的东西 , 本身也不一定有什么区别 , 反正不可能错 。
说到unicode , 就不一样了 。唯*的unicode字符集对应于三种编码:utf-8、utf-16和utf-32 。字符集、编码等概念完全分离、模块化 , 在unicode时代得到广泛认可 。
- 社保卡不知道密码怎么办
- 拼多多老店铺怎么刷?
- QQ加人时密码怎么弄
- 如何找回四六级报名登录密码
- 手机银行忘记登录密码怎么办
- 怎样设置12306的账号和密码
- 支付宝校验码就是支付宝密码吗
- 苹果电脑忘记密码怎么办
- ok交易所密码不记得怎么找回◎ok交易所密码怎么设置
- 苹果忘记id密码怎么办