从字符集发展史看Unicode和UTF-8的区别
版权声明
本文并非本人原创,其内容来源于网络,本文根据其演绎而来,具体出出已经无法考证,在这里只好给出我所参考的连接。
ASCII编码
我们都知道计算机来源于美国,并且计算机它比较笨,只知道 0
和 1
也就是电路的通和断(0或1即是一个二进制位)。那么美国人怎么使用计算机来存储他们的信息呢? 他们想了一个办法。将8个二进制位视为一组--也就是一字节(8bit=1byte). 1byte能够标表示 256
个数字数据范围是 0-255
。 就这样每一个数字就人为地赋予一个意思,比如 10 就代表换行,41 就代表大写字母 A。而0-31 都是一些特殊的字符,这些字符在古老的时候用来控制终端(比如说打印机)的行为。而从32 - 127 就代表一些实意的字符。0 到 127 就正好能够将所有的英文的字符都囊括进来,所以美国人就可以很开心的使用计算机了。
计算机的不断发展
在后来,越来越多的国家都开始使用计算机了,但是有些国家可能有自己的语言并不是英语,那么现在现有的ASCII编码已经不适用了。那么怎么办呢? 现有的ASCII编码还有将所有的位置都占满,所以非英语的国家都开始扩张ASCII编码的编码集,陆陆续续的将 127 之后的字符都渐渐地用上了。这时候计算机仍然在迅速地在全球蔓延。
迟到的中国
在中国引入了计算机时,ASCII编码0-255都已经被先来的国家给占据了,已经没有给中文留位置了。怎么办呢? 那咱中国就搞自己的字符集。在一些大佬们的努力下想出了一个解决方案--扩展ASCII编码
。废除了127之后的所有的后来添加的字符,保留原有的英文字符。并且扩展了原有的ASCII的编码规则,原来的ASCII编码规则是 1byte代表一个字符,但是这已经不适用咱们国家了,所以又加了一个byte,两个byte代表一个中文字符。那么如何判断二进制是一个中文字符还是一个英文字符呢?
新的编码规则是这样规定的(两个>127的byte标识一个汉字),如果一个byte>127 那么就表明,这是一个中文字符的第一个字节(被称为高位字节),那么一个高位字节和一个高位字节就代表一个中文字符;而如果一个byte的值<=127那么这一个byte就代表一个英文字符。
就这样我们的新的字符集已经形成了,它被称为 GB2313
,其扩展了ASCII编码集,实现了汉字的存储,GB2312一个可以存储6000多个常用的中文字符了甚至还存储了一些数学符号和日本的片假字还有英文符号的具有高位字节的标识形式--也就是 全角字符
而原来的英文符号被称为 半角字符
。
这也就是为什么我们常说: 一个汉字占两个字节,一个英文占一个字节。
GB2312不够用了
GB2313编码解决了中文字符输入的问题,但是只有6000多个常用字,那么就导致很多生僻字是没有在字符集里面的,???? 然而,我们都知道,很多人的名字中都会有一些生僻字的,这就比较绝望了,GB2312 还得进行扩展。
原来的GB2312的 高位字节和低位字节规定的都得是 127
之后的数字,现在干脆不规定低位字节必须得大于 127
的,现在的心的字符集已经被大大地扩展了, 不仅仅是简体字被包括了进来并且繁体字也被包括过来了---这一编码被称为 GBK
编码。
紧接着计算机又逐渐地普及,少数民族也开始需要使用计算机了,每个民族都有自己的文字并且都需要在计算机中存储。现有的GBK编码集中还没有少数民族的文字,所以有进行了一次扩展,进的编码规则被称为 GB18030
。现在我们祖国的文化知识已经可以在计算机中流传了。
后再这些编码被中国的程序员们统称为 DBCS(Double Byte Charecter Set 双字节字符集)。
Unicode的诞生
计算机已经在世界范围内普及了,但是国家与国家之间的信息的交换出现了一些问题。因为每个国家都有自己的编码格式,大家之间互相不理解,设置就连我国大陆地区和我国的*地区也不兼容。国与国之间信息的交换称为了问题。
这是或ISO组织站出来准备解决这个问题,解决方式很简单: 他废除了所有的编码格式,全球统一的编码---Universal Multiple-Octet Coded Character Set 简称为 UCS
我们俗称为 Unicode
。他还有一个响亮的 Chinese Name 叫做 万国码
。
Unicode编码的规则是,不管是不是英文字符都占有两个 byte ,我们知道英文字符只需要占一个byte就行了,而Unicode规定在高位字节进行补0。
UTF-8
通过Unicode,我们解决了国家与国家之间的信息的流通,但是Unicode有一个非常显著地缺点---不管是不是英文字符都会占两个byte。大家都知道计算机中大量存储地字符还是英文字符,而英文字符之外的字符只占据了一部分。使用Unicode就造成了存储和传输的资源的浪费。
因为Unicode的缺点,所以在很长的时间里没办法进行推广,直到互联网的产生,为了解决Unicode编码在网络上传输的问题,很多 UTF(UCS Transfer Format) 标准出现了, 比如 UTF-8和UTF-16,顾名思义,UTF-8 就是以8位传输数据,UTF16就是以18位传输数据。UTF-8是使用的广泛的Unicode的实现方式。
UTF-8 的最大特点是,它是一个 变长
的编码方式,UTF-8 会根据字符的不同采用 1-4个字节来表示。如果在ASCII编码范围内的话就通过一个字节来表示,否则则通过多个字节来表示。在Unicode中一个中文占据两个字节,而在UTF-8编码中,一个中文字符占3个字节。UTF-8和Unicode并不是直接对应的,在这之间需要通过一系列的算法转化。
总结
从这本文我们大家已经明白了Unicode和UTF-8的区别了
- ASCII,GB2312,Unicode是一种字符集也是一种编码方式
- UTF-8只是Unicode字符集的一种实现方式,UTF-8只是一种编码格式,而不是一个字符集。