我们计算机内部只会识别0、1这样的二进制。计算机是老美发明的,所以一开始只有字母+数字这样的符号。一个字节8位二进制表示字母数字和标点足以 00000000-11111111 可以表示256种状态。 因为语言的多样性,中文、日文...,无法用一个字节表示了,简单暴力那就在加一个字节。于是像中文就出现了像gb2312这种,每个国家有自己的编码方式。于是就出现unicode,一个字符大集合,世界统一。 但是又出现了一个新问题, 像英文字母一个字节就行,中文有的是两个字节,有的是三个字节。像“A哈喽”这种计算机要如何读取识别呢?每次读取一个字节肯定不行,中文无法解析,有的人说那好办,像字母也给弄成两个字节,第一个字节二进制位全是0即可 类似 00000000 0001000 。这种可以是可以就是浪费存储了。 最好的办法就是让计算机知道 一次读取几个字节, 于是UTF-8出现了
- 单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
- 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
(十六进制) | (二进制)
----------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
如果第一个字节的第一位为0,那么就是一个字节, 如果第一个字节是1,那么如果是两个连续1,就表示占用两个字节,三个连续1,表示占用三个字节,这样的话,计算机就知道该如何读取数据了 以“益”为例:unicode是76CA(100111000100101),对应上表第三档,那么对应的UTF-8二进制格式应该是 1110xxxx 10xxxxxx 10xxxxxx。 由益的最后一个二进制开始依次向后填写,缺失的位置补0。于是 得出UTF-8 11100100 10111000 10100101
utf8是unicode的一种实现,unicode是统一编码方式,utf8为了节省存储