Unicode详解 真干货! 一文带你手撕Unicode

如果有错误也希望大佬指正!


Unicode 字符集: https://home.unicode.org/
可以使用编码工具根据下面的内容自己尝试编码: https://www.toolhelper.cn/EncodeDecode/EncodeDecode

表示方法: \x表示字节, U+表示码点.

计算机存储字节序列有大端小端两种排序方式 (由硬件决定), 分别对应 以字节位单位左边为高位以字节位单位左边为低位
举例: 0xFFAA 在大端模式下存储为 \xFF\xAA 在小端模式下存储为 \xAA\xFF.
在 UTF-8 编码中不存在字节序的问题!

搞明白Unicode的关键在于理解码点和存储内容的关系, 以及计算机具体是如何存储码点的.
码点是 Unicode 定义的标准, 通过码点你能够找到对应的字符, 但计算机并不是直接存储码点的!

UTF-8

UTF-8 是一种动态长度的编码, 占用的空间通常为 1 byte~4 byte, 并且兼容 ASCII 编码.

  • UTF-8 的编码规则

    1. 单字节: 以0开头
    2. 双字节: 将码点分成两部分, 以110开头, 往后的每个字节以10开头
    3. 三字节: 将码点分成三部分, 以1110开头, 往后的每个字节以10开头
    4. 四字节: 将码点分成四部分, 以11110开头, 往后的每个字节以10开头

下面给出一张表, 以便更直观的理解 UTF-8 的编码规则:

字节数 Unicode码点 UFT-8编码序列
1 byte 0aaaaaaa 0aaaaaaa
2 byte 0000aaaa aabbbbbb 110aaaaaa 10bbbbbb
3 byte aaaabbbb bbcccccc 1110aaaa 10bbbbbb 10cccccc
4 byte 000aaabb bbbbcccc ccdddddd 11110aaa 10bbbbbb 10cccccc 10dddddd

小练习: 计算出 码点U+1F601 对应的二进制编码序列, 转换成字节序列后在编码工具中解码.
如果没问题的话结果会是一个笑脸的emoji.

UTF-16

UTF-16 也是一种动态长度的编码, 占用的空间通常为 2 byte4 byte.
学习UTF-16之前有几个概念先要了解一下, Unicode 前 65536 个字符被称为基本平面, 这个部分用 2 byte 就足够存储了. 其余的部分称为 辅助平面, 这部分共有 2^20 个字符, 需要 20 bit才够存储, 与UTF-8类似, UTF-16 也是将这20位拆开存储的.

  • UTF-16 的编码规则

    1. 基本平面 (双字节): 直接存储码点, 但是 Unicode 中保留了 U+D800 ~ U+DFFF 用于四字节, 这一段不对应任何字符.
    2. 辅助平面 (四字节): 将码点分成两个部分(每个部分10位), 第一个部分以 110110 开头, 第二个部分以 110111 开头.
      给出下表以便更直观的理解 UTF-16 的编码规则:
字节数 Unicode码点 UTF-16编码序列
2 byte aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa
4 byte 0001aaaa aaaaaabb bbbbbbbb 110110aa aaaaaaaa 110111bb bbbbbbbb

下面有三点要补充一下:
1. 110110aa aaaaaaaa 换成16进制的范围为 0xD800 ~ 0xDBFF; 110111bb bbbbbbbb 换成16进制的范围为 0xDC00 ~ 0xDFFF.
2. 注意, UTF-16 的表格中码点左边的第 4 位固定是 1. 因为辅助平面需要表示 U+1000 ~ U+10FFFF, 将其转换为二进制会发现左边第三位固定是 1.
3. Unicode 最大的码点是 U+10FFFF, 这也是为什么上面两个表格中最后一行码点的前三位都是 0.

小练习: 计算出 码点U+1F601 对应的二进制编码序列, 转换成字节序列后在编码工具中解码. (注意大小端字节序!)

UTF-32

UTF-32 是一种固定长度的编码, 占用的空间为 4 byte. UTF-32 直接存储码点. UTF-32 同样也存在大小端序列的问题.

小练习: 计算出 码点U+1F601 对应的二进制编码序列, 转换成字节序列后在编码工具中解码. (注意大小端字节序!)


个人精力有限, 只能尽可能的把内容讲的清楚, 肯定多多少少会有一些讲的不到位得到地方, 多多理解~~~

Unicode详解 真干货! 一文带你手撕Unicode相关推荐

  1. 一文带你手撕metasploit中meterprter木马源码_雁不过衡阳

    前言 自从将CobaltStrike二开之后放在了GITHUB之后,有些人询问我当时MSF的源码级免杀怎么做的,今天决定带大家手撕metasploit中meterpreter源码. 生成meterpr ...

  2. 面试官:如何用a标签实现文件下载?(一文带你手撕知识点)

    前言 大家好,今天给大家带来前端小知识:前端利用a标签实现文件(图片)下载,也就是教大家利用a标签或者是 window.open() 来实现下载功能. 文章目录 前言 常用方式 方法分析 代码实现 常 ...

  3. 【网络安全篇】PHP文件与目录操作(一文带你手撕迷茫)

  4. python中unicode编码表_Python中的字符串操作和编码Unicode详解

    本文主要给大家介绍了关于 Python中的字符串操作和编码Unicode的一些知识,下面话不多说,需要的朋友们下面来一起学习吧. 字符串类型 str:Unicode字符串.采用''或者r''构造的字符 ...

  5. Tensorflow安装教程详解(图文详解,深度好文)

    Tensorflow安装教程详解(图文详解,深度好文) 前言 安装前的准备工作 关于python 关于Anaconda 开始使用Tensorflow 系统内配置Anaconda使用路径 Anacond ...

  6. linux系统四个组成部分,Linux系统由哪几部分组成?系统详解(干货)

    原标题:Linux系统由哪几部分组成?系统详解(干货) 我们常说的Linux一般指的是系统内核,基于Linux系统内核的操作系统叫Linux发行版操作系统,像redhat.centos.ubuntu和 ...

  7. phpstudy的php fpm,PHP_php-fpm配置详解,php5.3自带php-fpm复制代码 代码 - phpStudy

    php-fpm配置详解 php5.3自带php-fpm /usr/local/php/etc/php-fpm.conf pid = run/php-fpm.pid pid设置,默认在安装目录中的var ...

  8. java生成pdf方法_详解Java生成PDF文档方法|chu

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...

  9. 最经典的HashMap图文详解,干货满满!

    前言 我们说 Kafka 是一个消息队列,其实更加确切的说:是 Broker 这个核心部件.为何这么说?你会发现我们可以通过控制台. Java 代码. C++ 代码.甚至是 Socket 向 Brok ...

最新文章

  1. 《OpenCV3编程入门》学习笔记5 Core组件进阶(三)分离合并颜色通道
  2. 学软件测试的优势有哪些
  3. LearnOpenCV学习——平均脸faceAverage.py
  4. matlab数据接口技术,实战MATLAB之文件与数据接口技术
  5. 关于SSIS中解密数据库字符串的方法
  6. ITK:从测量列表创建直方图
  7. 禅道 Rest API 开发
  8. 电话骗术升级了,提高警惕! (转自公司内部新闻组,真人真事)
  9. flex java 上传下载_完整的Flex多文件上传实例
  10. DenyHosts清除黑名单IP地址方法
  11. 浅析变长数组(VLA)和动态数组
  12. 单片机原理及应用程序c语言版题库,单片机原理及应用期末复习题库(含答案)...
  13. MapGIS入门教程——基础操作
  14. C语言开发环境搭建及调试
  15. C语言自动计数功能,《Objective-C高级编程》温故知新之自动引用计数
  16. 【3D建模制作技巧分享】Zbrush中凹凸贴图、法线贴图和置换贴图的区别
  17. 看不懂淘宝特价版,就像之前看不懂拼多多?
  18. 战地之王Awesonmium
  19. Vue 2.7 正式发布,代号为 Naruto
  20. C++笔试题大全----下

热门文章

  1. 深入了解戴维斯双击和戴维斯双杀
  2. JAVA WEB技术
  3. 初级——如何进行Android单元测试
  4. 请求与通配符 mime 映射相匹配。请求映射到静态文件处理程序。如果有不同的前提条件,请求将映射到另一个处理程序。
  5. python循环输出1到10_用Python编写一个程序,使用for循环输出0~10之间的整数
  6. Latex字体加粗不了
  7. Eclipse如何导入jar包
  8. 活动及宣传内容发布审批小程序开发制作
  9. TinyOS总体介绍
  10. quickBI数据脱敏