Unicode字符集与utf-8编码

我们都知道计算存储数据和传输数据都是以二进制的形式,也就是0和1,这是因为0和1刚好对应电路中的高电位和低电位。

计算机中最小的存储单位为字节(byte),最小传输单位是位(bit),一个字节占8位。

既然计算机存储的是二进制数,那么在显示终端上是怎么展示成人类识别的文字或者符号的呢?

我们知道计算机最开始是在美国使用,他们为了解决这个问题,于是想了一个办法,将每一个符号(文字)与一个数值对应,比如英文字母"a",对应数字97,以二进制表示为01100001。而8位共有2的8次方256中排列组合,而英文字母一共只有26个,加上大小写52个,再加上阿拉伯数字0到10和一些符号,一共排到了127,一个字节刚好够存储。于是美国人就把这个二进制与字符的映射关系叫做ANSI,也就是Ascii(美国标准信息互换码)。

后来计算机传到了其他国家,但他们的一些字符ANSI里面没有,于是,他们将自己国家的字符往127后继续排,直到255,他们把128-255这段称为扩展字符集。但是255是远远不够的,尤其是当计算机传到中国,光是常用汉字就有3000多个。

于是聪明的中国人把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。

不仅是中国,其他国家也搞一套自己的字符集,结果谁也不懂谁的编码。

就在这个时候,一个叫做ISO(国际标准化组织)的组织出现了,它说这样不行,得由他来定义一套统一得标准,于是,他废除了其他地区的编码方法,重新搞了一套包含地球上所有文字,和符号的编码,也就是unicode编码,俗称万国码。

ISO规定,所有的字符必须用两个字节表示,也就是16位,对于Ascii字符集里的也用两个字节表示,高位用0补齐。

这样有一个很大的问题,就是当字符对应的码点数小于255时,因为高8位永远为0,这样我们就极大地浪费了存储空间,但是如果我们把这个为0的8位去掉,计算机怎么认识,那个字符占8位,那个占16位呢,举个例子

字符串"a我"用如果以unicdeo标准来表示则为"00000000 01100001 01100010 00010001"(为了便于阅读我每8为加了一个空格)

这样计算机读取的时候,可以每次固定取16位,然后根据字符集对应的码点找到对应的字符。

但是如果我们为了节省空间,把第一个8位为0去掉,则为"01100001 01100010 00010001",这样在存储的时候是没有问题的,我们根据对应的字符,找到其码点数,如果高8位是0就去掉。

但是当我们需要从计算机存储空间了读出来(比如显示在屏幕上),计算机就不知道那个字符是两个字节,那个是一个字节了。

因为每个字符现在所占字节数不是固定的了。

知道UTF-8(UCS Transfer Format)出现,

UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到utf-8并不是直接的对应,而是要过一些算法和规则来转换。

UTF8的编码方式:

根据上表的规范,0-127码点数对应的字符,我们用一个字节表示,其第一位为0;

如果第一位是1,则看连续几个1,如果是2个则表示两个字节存储,三个就是三个字节存储,首个字节连续1后面是个0,后面的字节前两位都用10填充。这些位置确定好后,再找到对应字符的码点数,从右往左对应往里填充,不足的用0补充。

以"我"为例"01100010 00010001" =>25105,从上表中看,需要三个字节存储

首先是1110xxxx 10xxxxxx 10xxxxxx

然后我们将01100010 00010001从右到左往x里填 => 11100110 10001000 10010001

结果就是如上。这就是UTF-8的编码思想。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章