ASCII码,Unicode码,UTF-8码
一. 编码简介
在计算机内部 所有数据都使用 二进制表示 。每一个二进制位 bit 有 0 和 1 两种状态,因此8个二进制位就可以组合出 256 种状态 这被称为一个字节 byte
。一个字节一共可以用来表示 256 种不同的状态 每一个状态对应一个符号 就是 256 个符号 从0000000
到 11111111
- 字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符号,数字等。
- 字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。
- 字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一个字符用多少字节表示等问题,则是由编码来决定的。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
二. ASCII码
上个世纪 60 年代 美国制定了一套字符编码 对英语字符与二进制位之间的关系做了统一规定 。 这被称为ASCII码 。ASCII 码一共规定了128个字符的编码 ,比如空格 SPACE
是32二进制 00100000
大写的字母 A 是 65 二进制 01000001
,这128 个符号 包括 32 个不能打印出来的控制符号只占用了一个字节的后面7位最前面的1位统一规定为0 。
- 0~31及127(共 33个 )是控制字符或通信专用字符(其余为可显示字符),如控制符:
LF
(换行)、CR
(回车)、FF
(换页)、DEL
(删除)、BS
(退格 ) - 32~126(共 95个 )是字符 (32是空格),其中48~57为 0到 9十个阿拉伯数字。
- 65~90为 26个大写英文字母, 97~122号为 26个小写英文字母,其余为一些标点符号、运算符号等。
- 后 128个称为扩展 ASCII码。许多基于 x86的系统都支持使用扩展(或“高”) ASCII。扩展ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。
缺点
- 不能表示所有字符 。
- 相同的编码表示的字符不一样 比如 130 在法语编码中代表了 é 在希伯来语编码中却代表了字母 Gimel
三. Unicode码
Unicode 一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,使用 Unicode 没有乱码的问题 。
缺点
Unicode 只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储:无法区别 Unicode 和 ASCII :计算机无法区分三个字节表示一个符号还是分别表示三个符号。另外, 我们知道,英文字母只用一个字节表示就够了,如果Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0 ,这对于存储空间来说是极大的浪费。
四. UTF-8码
- UTF 8 是在互联网上使用最广的一种 Unicode 的实现方式。
- UTF 8 是一种变长的编码方式。它可以使用16个字节表示一个符号,根据 不同的符号而变化字节长度。
UTF 8 的编码规则:
-
对于单字节的 UTF 8 编码,该字节的最高位为 0 ,其余 7 位用来对字符进行编码(等同于ASCII 码)。
-
对于多字节的 UTF 8 编码,如果编码包含 n 个字节,那么第一个字节的前 n 位为 1 ,第一个字节的第 n+1 位为 0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有的字节,都是最高两位为 " 10",其余 6 位用来对字符进行编码。