深入浅出计算机组成原理-二进制编码

字符集

字符集表示的可以是字符的一个集合,比如“中文”就是一个字符集,不过这样描述一个字集并不准确,想要更精确一点,我们可以说:“第一版《新华字典》里面出现的所有汉字”这是一个字符集。这样我们才能明确知道,一个字符在不在这个字符集里面。比如,我们日常说的Unicode,其实就是一个字符集,包含了150种语言的14万个不同的字符。

字符编码

字符编码是对字符集里的这些字符,怎么一一用二进制表示出来的一个字典。我们上面说的Unicode,就可以用UTF-8、UTF-16、UTF-32来进行编码,存储成二进制。所以,有了字符集我们甚至可以自己发明自己的一种字符编码。

乱码

同样的文本,采用不同的编码存储下来,如果另一个程序,用一种不同的编码方式来进行解码和展示,就会出现乱码。

字节流和字符流

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全部是字节文件。

所有文件的储存都是字节(byte)的存储,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,在储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

字节流可以用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;字节流提供了处理任何类型的io操作的功能,但是它不能直接处理Unicode字符,而字符流就可以。

字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文本文件本身直接操作的,而字符流在操作的时候是用到缓冲区的。在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按照字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。