一、ASCII
- 全称:American Standard Code for Information Interchange。
- 占用 1 个字节。
- 共可以表示 128 个字符,因为最前面那一位始终为 0 。
- 程序员必背:
字符 ASCII码 ‘0’ 48 ‘A’ 65 ‘a’ 97
二、UNICODE (Universal Code)
Unicode 只是一个符号集,它只规定了字符与二进制代码的对应关系,却没有规定这个二进制代码存储方式。也就是说有的字符可能占一个字节,有的可能占用 2 个、3 个或者更多。因为计算机无法知道内存中三个字节代表是一个字符还是两个还是三个,所以最好能够统一字节数目,但是如果统一为 3 个字节的话,ASCII码字符对应的二进制前面两个字节都得填充 0,这对存储空间是一个极大的浪费。为了解决上述问题,出现了很多 unicode 的很多实现方法,例如:utf-8、utf-16、utf-32。
三、UTF-8
1、全称:UCS Transformation Format 8bit。
2、Unicode 编码范围是:0-0x10FFFF。
这是一种占用的字节可以变长的编码方式,这个方案的意思以 8 位为单位来标识文字。编码规则如下。
Unicode 编码(16进制) | UTF-8 字节流(二进制) |
000000 - 00007F | 0XXXXXXX |
000080 - 0007FF | 110XXXXX 10XXXXXX |
000800 - 00FFFF | 1110XXXX 10XXXXXX 10XXXXXX |
010000 - 10FFFF | 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX |
(1)对于单字节的字符,第一位为 0,其他位为 unicode 编码(与ASCII相同)。
(2)对于多字节(n)的字符,从左往右数,第一个字节的前 n 位为,第(n+1)位为 0,后面的字节的前两位分别是1和0,其他各位依次填入 UNICODE 编码,剩余位置填 0 。
栗子:
字符“人”的 unicode 编码为 0x4eba,其二进制为100111010111010,由此可知其一共占用了16位,故UTF-8的实现方法是:11100100 10111010 10111010。
上述中,双星号括起来的部分为unicode编码,其他部分为UTF-8的规则位。
四、UTF-16、UTF-32
任何字符都是使用 2 个字节或者 4 个字节存储。
上述字符“人”的 UTF-16 的是实现方式为 100111010111010 。
上述字符“人”的 UTF-32 的是实现方式为 0000000000000000100111010111010 。
五、UTF-8 和 UTF-16 的优缺点
- 当字符的 unicode 编码是单个字节时,用 UTF-8 合适,因为向下兼容ASCII码,占用空间小。
- 当字符的 unicode 编码是多个字节时,用 UTF-16 或者 UTF-32 合适,因为节省空间(少去了 UTF-8 的规则位)。
- UTF-8 容错率较低,因为在解码时需要参照字节开始位,若文件传输过程中开始位传输错误,就可能导致后面所有的位就乱码。而 UTF-16 和 UTF-32 则不会,因为不需要参照字节开始位,某一位传输错误,不影响后续字符的解码。
- UTF-8 编码容量更大,更加灵活,可以满足现存的所有的字符的要求。UTF-16 则只能编码 65536 个字符,使用其时不得不考虑有的字符无法编码的问题。
- UTF-16 要考虑大小端字节序的问题,UTF-8 则不用。
六、ANSI 编码
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文 Windows 操作系统中,ANSI 编码代表 GBK 编码;在繁体中文 Windows 操作系统中,ANSI编码代表 Big5;在日文 Windows 操作系统中,ANSI 编码代表 Shift_JIS 编码。ANSI 编码表示英文字符时用一个字节,表示中文用两个或四个字节。
(SAW:Game Over!)