最开始是只有一个字节的 ascii 编码包括 0 -127,也就是英文字符,比如 abcdef 还有!@#*&^ 等等
然后又有了其它语言的编码,例如专门为中文设计的 gbk 编码 …
这些编码是不兼容,为了兼容所有的编码,统一制定了 unicode 字符集
unicode 只是一个字符集,它为全世界每一个字符分配一个数字,而这些数字在传输过程中,需要进行编码,解码,这里编码,解码的工具就是 utf-8,除了 utf-8,还有 utf-16,utf-32
utf-8: 多字节编码的字符,一个字符可以通过 1 - 6 个字节来编码,这样做的最大的优点就是节约内存,例如 0x01 只需要按照 ascii 那样使用一个字节来存储,而一个汉子则用两个字节
utf-16: 每个字符使用两个字节来编码,java 的字符串就是 utf-16
utf-32: 每个字符使用 4 个字节来编码
unicode 字符集和 unicode 编码的转换方式如下
unicode utf-8
00000000-0000007f 0xxxxxxx
00000080-000007ff 110xxxxx 10xxxxxx
00000800-0000ffff 1110xxxx 10xxxxxx 10xxxxxx
00010000-001fffff 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000-03ffffff 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000-7fffffff 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
在上面的表中,utf- 8 下面的 x 就是用来填充字符的 01 比特的,而每个字节前面的 0,10,110… 等等是用来确定这个字符在 utf- 8 中占用的字节数的