ASCII
所有字符只占一个字节的编码,只包含英文和英文符号,和一些控制字符
Unicode
Unicode 只是一个字符集,不是一种具体的编码,这个字符集为所有字符分配了一个具体的编号,从 0x000000
到 0x10FFFF
,总共 110 多万,换而言之,它只规定了编号是多少,但没有规定编号如何去存储,举个例子,在 utf-8
中,128号字符对应的是 0b11000000 10000000
,其值并不等于 128,而在 utf-32
中,其值则确实等于 128:0x000080
UTF-8
UTF-8,是 Unicode 的实现之一,其他的实现还包括 UTF-16, UTF-32 和 GB18030
目前来说,UTF-8 是 web 上最常见的编码
UTF-8的特点就是变长,单个字节用于表示常见的 ASCII 字符,而中文汉字多是三个字节,也有占四个字节的生僻字
0xxxxxxx (0-127)
110xxxxx 10xxxxxx (128-2047)
1110xxxx 10xxxxxx 10xxxxxx (2048-65535)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (>= 65536)
UTF-16
所有字符都占两个字节的编码
值得一提的是,有种编码叫 UCS-2 也是所有字符都占两个字节的一种编码,通常称 Unicode (在 java 中,或者在 windows 的记事本里),这种编码和 UTF-16 大体上是一致的,但并不相等,有部分编码不同
UTF-32
直接翻译 Unicode 的一种编码,所有字符都占4个字节
GB 2312 与 GBK
GB 2312 只收录 6763 个汉字,所有字符都是两个字节的,包括英文和符号字符
GBK 是 GB 2312 的扩展版本,完全兼容 GB 2312,同样是双字节