关于字符编码的基本原理思考

来源:互联网 发布:行知中学录取分数线 编辑:程序博客网 时间:2024/05/21 09:28

在电脑的世界里,所有的信息其实都是由10这样的比特流组成的。

有时候我们可能会听到某些大牛的嘴里冒出一些词,比如说字节、字。

10这样的比特位与字节、字有什么样的关系呢?

其实,它们的关系,取决于你从什么角度去看。

1、如果从信息的本质角度来看,信息就是有10这样的比特流构成的。

2、如果从存储的角度来看,字节是存储的最小单元。其中,一个字节等于8个比特位(10)。

3、如果从CPU操作总线角度来看,一次读取的一个字长。其中,一个字通常等于4个字节。为什么说是通常?因为现在的系统通常是32位的系统,16位比较罕见,而64位比较少用。因此可以这样说,一个字的长度取决于系统是几位的,如果是32位的系统,那么一个字长为4个字节,而64位系统的一个字长则为8个字节(注:字长的计算方法很简单,拿系统的位数除以8(bits)即可)。

这里可以简单归纳下:一个字长等于4个字节;一个字节等于8个比特位。这就是几哥俩的关系。

既然上面说了,所有的信息都是这些10构成的,那么我想问英文小写字母a是怎么构成的呢?

嗯,这个问题很有深度!

这得从电脑的发明说起。众所周知,电脑是老美发明的,老美首先考虑到英文字符的实现,其实现的方式为:把8个比特位构成的一个存储单元映射到一个字符上。比如说,0110 0001就代表 英文小写字母a。基于这个原理,ascii字符集诞生了。如果你到网上去搜索ascii字符集时,你会发现在ascii码是有限的128个。你可能会问,怎么不是256个?这个问题留待读者自行解决!

好啦,英文字符表示的问题解决了,那么我们中国汉字怎么办?汉字怎么表啊?!

当然,这个世界的牛人还是很多的。汉字表示的问题就小case啦!

那怎么表示呢?!

就目前主流的中文简体编码(GB2312)而言吧,是使用两个字节来表示一个中文字符的。至于其中简体汉字表示的原理,这里就不多说了。

还有很多其他的语言如繁体汉字/日文/韩文等,它们的字符构成基本原理是一样的。只是其中表示的方式不同而已。

你可能会问,哪有没有一种编码方式可以包含多种语言的表示?!

恩,确实有人想到了,比如说Unicode字符集。下面一段来自百度百科对它的评价:

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

 

在实际应用中,可能你会碰到这样的事情:

打开一个网页,里边显示的内容居然是乱码。

其中的原理很简单,比如说,你收到的是一段比特流1010001100110,它本身应该用UTF-8方式来解码的,但是你却用了GB2312方式来解码它,那得到的结果自然是乱码。那应该怎么样才是正确的呢?答案是解铃还须系铃人。比方说,如果你在客户端指定了网页的编码为GB2312方式,那么从服务端过来的信息也应该是GB2312方式的。也就是说,两边的编码解码的方式要一致。这好像看似简单,当你置身于实际的应用环境中时,你会把这个忘得一干二净。真正理解它不容易!

 

到这里,当然还不能结束,我们还是要回到文章的第一句:

在电脑的世界里,所有的信息其实都是由10这样的比特流组成的。

上面说了,字符的表示,其实文件的表示也是如此。

无论是一个word格式的文件,还是一个可执行程序(.exe),其实也是一样由10来构成的。不同的是,它们各有自己的字节序列而已。

Linux操作系统下,常常会听说到大小端的问题。其实这也是一个字节序列的问题,它与处理器的架构有关

所谓的大端就是高地址存储低字节,低地址存储高字节。小端正好相反。

如果你是从事Linux平台开发的,应该会发现ascii文本类型比二进制可执行程序更具有跨平台可移植特性。

原创粉丝点击