讲在最前面:两者之间的区别:
unicode是字符集
utf-8是编码规则。
讲讲字符集的历史。
话说当年有一群人,用8个可以开合的晶体管来组合成不同的状态,来表示世间万物。这8个开合状态,他们称之为字节。后来他们又做出了可以处理这些字节的机器,他们称之为计算器。
(ASCII),开始计算机只在美国用。8位字节一共可以组合成256种状态。他们把其中编号从0开始的32种状态分别规定了特殊的用途,这些字节传过来时就要做一些约定的动作,他们看这样挺nice的,于是0x20以下的字节状态称为控制码。他们又把空格,标点符号,大小写等其他的符号编到了127号,这样计算机就可以用不同的字节来储存英语文字了,然后大家觉得很棒棒,这个就是ASCLL(as key发音)编码的来历。
再到后来,世界上用计算机的人越来越多,但不是每个国家的人都是使用英语的,于是乎他们决定采用127号后面的空位来表示这些新的字母符号,从128到255这一页的字符集称为扩展字符集,从此以后再也没有新的状态可以用了。毕竟才8个字节。
(GB2312)后来到了中国人使用电脑时,发现没有可以利用的字节状态来表示汉字了,可恶啊。但是国人是很聪明的,做出了以下规定:把127号之后的奇异符号全部取消掉,一个小于127的字符意义与原先相同,但两个大于127的字符连接在一起时就表示1个汉字(128*128=16384,表示汉子够用啦),前面一个字节从0xA1到0xF7,后一个字节从0xA1到0xFE,这样可以组合出7000多个简体汉字,我们还把很多其他的东西编了进去,反正有多的状态,还把本来ASCII里面有的数字、标点、字母从新编了两个字节长的编码,这就是常说的全角字符。所以说GB2312是ASCII的中文扩展。
后来发现还是不够用,又把GB2312扩展了下,就规定只要第一个字节大于127就是汉子的开始,所以那个时候,会编程的计算机僧侣经常念叨:一个汉字算两个英文字符,当年大一学的总算理解了
当时每个国家的人都像中国这么整,每个都有自己的编码标准,所以要想在计算机上显示汉字就必须装上相关的汉字系统,折磨啊,要是装错,就会乱码。
就在这个时候,ISO(国际标准化组织)决定解决这个问题,方法很简单,废除所有地区的编码方案,从新制定编码规则,这就是后来的unicode。扯了这么多总算到正题了。
unicode开始制定的时候,计算机储存已经极大的发展了,空间已经不是问题了,于是ISO规定必须用两个字节来统一表示所有字符。原来的半角字符都扩展为16位,只是高8位全是0,大气啊。
从unicode开始,无论是半角的英文字母,还是全角的汉字,统统是统一的一个“字符”,也都是统一的两个字节,字符是一个文化相关的单位,在unicode中一个字符就是两个字节,一个汉字算两个英语字母的时代已经过去了。
unicode同样也有不完美的地方,如何区别ASCII和unicode
为了解决unicode如何在网络上传输的问题,于是面向传输的众多UTF标准出现了,UTF-8顾名思义就是每次传输8位数据。UTF-8是使用最广的方式。
UTF-8最大的特点,就是他是一种变长的编码方式。他可以用1~4个字节表示一个符号,根据不同符号而变化字节长度。参考文章:https://www.zhihu.com/question/23374078