理解数据背后的二进制(二):字符编码与 char 的含义

  1. 编码的分类?
    答:编码有两大类:一类是非 Unicode 编码;另一类是 Unicode 编码。

  2. 计算机存储的最小单位是?
    答:byte,即字节,8 位。

  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 个数字之内。
    • 但并没有规定这个编号怎么对应到二进制表示,那编号怎么对应到二进制呢?有多种方案,其中之一是 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 的位运算可以看作是对应整数的运算,只是它是无符号数,即,有符号右移 >> 和无符号右移 >>> 的结果是一样的。