对 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
如果有哪里写错了,麻烦大家可以帮忙指出,谢谢!
- 对 Unicode、UTF-8 的一些理解
- unicode utf-8 的理解
- Unicode、UTF-8的理解
- Unicode与UTF-8的区别理解
- 字符编码(UNICODE,UTF-8,UTF-16)的理解
- ASCII,Unicode,UTF-8,GB2312一些关于字符编码的理解
- 对各种字符集和字符编码的理解(Ansi,GB2312,Unicode,UCS,utf 8)
- 个人对码表的理解(ASCII,GBK,Unicode,UTF-8等)。
- 简单的理解unicode和utf-8的关系
- 关于utf-8 unicode gbk的转换的理解
- 深入理解Python的字符编码utf-8 & unicode
- 码表的理解(ASCII,GBK,Unicode,UTF-8等)
- 关于UTF-8,ANSI,以及Unicode的一些文章
- Python对中文字符的处理(utf-8/ gbk/ unicode)
- 对UTF-8的一些记录
- 统一码Unicode(UTF-8 UTF-16 GB18030等)的理解
- UTF-8、UTF-16、Unicode的区别
- Unicode/UTF-8的区别
- 直播 | Docker在测试场景中的应用
- AWS首席执行官Andy Jassy介绍AWS容器生态系统
- ios UIButton 热区范围、文字图片位置等拓展类实现
- SourceTree
- python libnum库安装使用方法
- 对 Unicode、UTF-8 的一些理解
- SQLServer------分页查询语句
- 设计模式最佳实践
- struts-访问静态
- mfc将显示在edit control控件中的内容输出到文本
- iOS开发之UILabel的使用
- PostgreSQL 与Oracle相比较
- Android M Permission 运行时权限 学习笔记
- 【图像分割】NVIDIA深度学习训练系统——实现图像分割与网络分割可视化