1. 编码的分类
- 编码有两大类:一类是非 Unicode 编码;另一类是 Unicode 编码
2. 计算机存储的最小单位是
byte
,即字节,8 位(bytedance,字节跳动,名字起得非常 geek)
3. 怎么理解 ASCII
- 世界上虽然有各种各样的字符,但计算机发明之初没有考虑那么多,基本上只考虑了美国的需求,谁让美国是计算机的发源地呢(英国图灵不高兴了)
- 美国大概只需要 128 个字符,所以就规定了 128 个字符的二进制表示方法。这个方法是一个标准,称为 ASCII 编码。全称是:American Standard Code for Information Interchange,即美国信息转换标准编码
- ASCII 码是基础,使用一个字节表示,最高位设为 0,其他 7 位表示 128 个字符。其他编码都是兼容 ASCII 的,最高位使用 1 来进行区分
4. 中文的第一个标准是
- GB2312,主要针对简体中文常见字符,包括约 7000 个汉字和一些罕见词和繁体字
5. 汉字用几个字节表示
- 在国标 GBK 中是用固定两个字节表示的
6. 怎么理解 Unicode 编码
- Unicode 做了一件事,就是给世界上所以字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 ~ 0x10FFFF,包括 110 多万个,但大部分常用字符都在 0x0000 ~ 0xFFFF 之间,即 65536 个数字之内(和 Android 的 65535 是巧合吗)。但并没有规定这个编号怎么对应到二进制表示,那编号怎么对应到二进制呢。有多种方案,其中之一是 UTF-8
- UTF-8 使用变长字节表示,每个字符使用的字节个数与其 Unicode 编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多,使用的字节个数为 1 ~ 4个不等
- UTF-8 使用 1 ~ 4 个字节表示,兼容 ASCII 编码,英文字符使用 1 个字节,中文字符大多用 3 个字节
7. 实际开发中遇到的乱码的原因是
- 有两种常见原因:一种比较简单,就是简单的解析错误
- 另外一种比较复杂,在错误解析的基础上进行了编码转换,这种情况是乱码产生的主要原因
8. 怎么理解 char
,char
的真正含义是什么
char
用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。char
本质上是一个固定占用两个字节的无符号正整数,这个整数对应于 Unicode 编号,用于表示那个 Unicode 编号对应的字符- 由于
char
本质上是一个整数,所以可以进行整数能做的一些运算,在进行运算时会被看做int
。但由于char
占两个字节,运算结果不能直接赋值给char
类型,需要进行强制类型转换,这和byte
、short
参与整数运算时类似的 char
类型的比较本质上就是其 Unicode 编号的比较。char 的位运算可以看作是对应整数的运算,只是它是无符号数,即:有符号右移>>
和无符号右移>>>
的结果是一样的