对 Unicode、UTF-8 的一些理解

来源:互联网 发布:济南java工程师待遇 编辑:程序博客网 时间:2024/06/17 06:37

对 Unicode、UTF-8 的一些理解


ISO8859-1、ASCII、GB2312、GBK、Unicode、UTF-8 的关系

之前没搞明白 ISO8859-1、ASCII、GB2312、GBK、Unicode、UTF-8 的关系,因此总是觉得云里雾里。
首先,要明白 ISO8859-1、ASCII、GB2312、GBK,它们既是字符集,又是编码方式。
而 Unicode,它只是字符集。它对应的编码方式有好几种,分别是 utf-8 、utf-16 等。


Unicode、UTF-8 的关系

搞清楚,Unicode 只是字符集(不像 ISO8858-1、ASCII、GB2312、GBK,它们既是字符集,又是编码方式),而 utf-8 是它的编码方式,所谓的 utf,就是 Unicode Transformation Format,即 Unicode 格式转换。


困扰我很久的疑惑

Unicode 用 2 个字节表示所有常用的字符集,utf-16 用 2 个字节编码 Unicode 字符。
上面的句子很好理解。但下面的句子可能就不好理解了。
Unicode 用 2 个字节表示所有常用的字符集,utf-8 用 1 到 6 个字节编码 Unicode 字符。
这是什么意思呢?
既然 Unicode 用两个字节表示所有的字符集,那编码方式不也是用两个字节来表示字符吗?
不是的。而且正是从 Unicode 开始,字符的定义与存储是分离的。而在早前的 ISO8859-1、GBK 等,字符的表示与存储是相结合(也就是前面说的它们既是字符集又是编码方式)。
但实际上,字符的表示和存储是可以分离的。因此,对于 Unicode 字符集,有着 utf-8 和 utf-16 编码方式。而这其中,utf-16 正是用两个字节来存储 Unicode 字符的。那“Unicode 用 2 个字节表示所有常用的字符集,utf-8 用 1 到 6 个字节编码 Unicode 字符。”这句话要怎么理解呢。往下看就能明白了。


先理解 utf-16

其实要理解 utf-8,先来理解 utf-16 会更好。
utf-16 是编码方式,表示任何字符对应的数字都用两个字节来保存。它跟 Unicode 很像,但是 Unicode 是字符集,是用来表示字符的,而 utf-16 则是在计算机中保存字符对应的数字的。嗯,这就是 utf-16 编码。


再来理解 utf-8

那既然有 utf-16 为什么我们还需要 utf-8 呢,这是因为 utf-16 编码,即使是字母字符,也要用两个字节来存储。这比使用 ISO8859-1 编码方式,占的空间大了一倍。这不好,因此就引出了 utf-8,utf-8 编码是可变字节编码,对于字母字符,它使用一个字节来存储。这样相对于 utf-16,就节省了很多空间啦。
但是由于是可变字节,计算机总得知道每次要读取多少个字节吧(也就是说多少个字节才是一个单元)。因此,utf-8 编码需要定义一些规则——字节中有些位数是用来做标志位。具体情况如下:
0xxxxxx,表示一个字节为单元;(计算机读取字节的时候,发现该字节以0开头,就表示一个字节为一个单元)
110xxxxx,表示两个字节为单元,后面紧跟着的是另一个字节:10xxxxxx;(计算机读取字节的时候,发现该字节以 110 开头,就明白这是以两个字节为一个单元的,因此还得往后再读一个字节,且下一个字节一定是以 10 开头)
1110xxxx,表示三个字节为单元,后面紧跟着的是另外两个字节:10xxxxxx 10xxxxxx。(计算机读取的过程类似上一步)


对上面疑惑的解答的补充

正因 utf-8 编码中字节的部分位数要用来做标志位,因此无法用两个字节来存储所有的字符集,因此会出现用三个字节来存储,甚至更多的字节来存储一个字符。然而这和 Unicode 的两个字节表示一个字符并不矛盾。一个是表示,一个是存储,是不一样的。


如果你看完也不知道我在说些什么也是正常的吧,毕竟其中还有很多很多知识没提到。毕竟以上,是在看了很多很多篇相关的文章也看了好几次才出来的一些知识点。
相关的文章,我觉得写得挺好的有:

https://jingyan.baidu.com/article/020278118741e91bcd9ce566.html
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://www.jianshu.com/p/36d20de2a1ee
http://m.blog.csdn.net/hotthought/article/details/50434916
http://m.blog.csdn.net/wuwangxinan/article/details/52488851
https://www.zhihu.com/question/23374078/answer/65352538 这个是来自知乎的,其中于洋、邱昊宇、uuspider、以及评论区的对答,我觉得收获蛮大的
https://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html


如果有哪里写错了,麻烦大家可以帮忙指出,谢谢!