ASCII,Unicode 和 UTF-8的区别

字节

英文为Byte,它是计算机信息技术中用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制,是一个很具体的存储空间。

字符

是指计算机中使用的字母、数字、汉字和各种符号,例如1,2,3,A,B,C,~,!,·,#,¥,%,*,—,+等等。

编码标准

谈到字符,就应该要想到相关的编码方式

ASCII

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。
ASCII(American Standard Code for Information Interchange:美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。

每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。
ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。具体的可以去查看ASCII的对照表,大概信息如下:

  • 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符)
  • 32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字
  • 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
    ASCII是美国标准,所以它不能良好满足其它国家的需要。

ANSI

ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00~0x7f 范围的 1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。
ANSI编码表示英文字符时用一个字节,表示中文时用两个或四个字节。

Unicode

Universal Multiple-Octet Coded Character Set
为了解决不同国家ANSI编码的冲突问题,Unicode应运而生:如果全世界每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode标准也在不断发展,但最常用的是:用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。
但是问题在于,原本可以用一个字节存储的英文字母在Unicode里面必须存两个字节,这就产生了浪费。那么有没有一种既能消除乱码,又能避免浪费的编码方式呢?答案就是UTF-8!

UTF-8

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。

UTF-8 最大的一个特点,就是它是一种变长的编码方式:它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,如此一来UTF-8编码也可以是为视为一种对ASCII码的拓展。
值得注意的是unicode编码中一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

参考资料

Unicode 和 UTF-8 有什么区别?
ASCII,Unicode 和 UTF-8

猜你喜欢

转载自blog.csdn.net/weixin_44728363/article/details/89377760