0%

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

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. 怎么理解 charchar 的真正含义是什么

  • char 用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。char 本质上是一个固定占用两个字节的无符号正整数,这个整数对应于 Unicode 编号,用于表示那个 Unicode 编号对应的字符
  • 由于 char 本质上是一个整数,所以可以进行整数能做的一些运算,在进行运算时会被看做 int。但由于 char 占两个字节,运算结果不能直接赋值给 char 类型,需要进行强制类型转换,这和 byteshort 参与整数运算时类似的
  • char 类型的比较本质上就是其 Unicode 编号的比较char 的位运算可以看作是对应整数的运算,只是它是无符号数,即:有符号右移 >> 和无符号右移 >>> 的结果是一样的
-------------------- 本文结束感谢您的阅读 --------------------