几张图带你看懂Unicode和UTF-8

news2024/11/6 3:16:41

一、二进制

为什么要编码? 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0)

我们用QQ给其他人发消息、发文件、发表情,最终会以二进制形式在网路中传输,到达后再转换回来

二进制

 

本地存储也一样,最终都是以二进制形式存储在计算机中

二、ASCII

问题来了,A电脑想给B电脑传送一个"a",假如转换的二进制是"110",那么B怎么知道这个二进制代表的是"a"呐

 a

问题主要原因是大家没有共识,就像甲地区110代表"a",到了乙地区110代表"b",两个地区就没办法正常交流

为了解决这个问题,一个叫标准化组织的单位(ISO)出面了:由我们来制定每个字母和二进制的对照关系,大家都按我这个对照关系转换即可(由于最早计算机是美国人玩的,所以需要建立对照关系的也就是英文字母和一些特殊字符),这个由ISO制定的对照关系就是ASCII编码,可以理解为给每个字符设置了一个唯一的ID

 ASCII

由于有了ASCII编码,大家就有了共识,互相沟通再无障碍

三、Unicode

后来时代再发展,越来越多的国家开始用计算机了,这时ASCII码就不够用了,比如“大”在ASCII码中找不到对应的二进制啊,那应该编多少?

为了解决这个问题,ISO又出面了,扩展对照关系,把世界上所有的语言的字符都加入到这个新对照关系,并重新命名为Unicode码,又叫万国码,霸气~

Unicode

 

可以发现二进制的位数变长了,因为原来ASCII字符少,现在把世界的字符都加上就越来越长了

四、实现

问题又来了,以上的图片每次都是只发送一个字符“a”和 “我”,但实际中我们传递信息肯定都是很多字符组成的句子,比如现在我们发"0a"两个字符,其中0的二进制是110000,a的二进制是1100001,如果发出去合起来就是1100001000001,这时候读法就有意思了,不同的断句读的结果就不一样
比如向后错开一位读取结果就变成了"a!"

 错误读

像极了了《九品芝麻官》里的搞笑状纸:

  • 收回黄公年租银两三十,万不能转租别人
  • 收回黄公年租银两三十万,不能转租别人

 

所以,光有共识的编码规则并不够,还要真正的实现方式(怎么找到字符和字符的边界),最简单的实现方法就是固定每个字符的二进制长度,不足的前面补零,早期的ASCII码8位二进制足以表示,所以就8位代表一个字符,这8位被称作一个字节,这是ASCII编码的早期实现

字节
​​

 

那么发展到现在,ASCII不够用了,改用Unicode,最大16位足以标识,可以用两个字节即16位代表一个字符,自然也不会出现断句错误问题,这就是Unicode的最简单实现方式,这种实现方式叫UTF-16

UTF-16

 

五、UTF-8

UTF-16可以正常进行网络交流信息,但有个致命的弱点:比如要发送一个阿拉伯数字"1","1"的Unicode码位是110001,6位二进制足够了,确因为要填满16位而在前面填充了10个0,这真是对网络和存储空间极大的浪费

于是,一种更为合理的Unicode编码实现方式UTF-8被广泛使用

UTF-8为什么更加合理?它的核心思想很简单:当字符Unicode码位小的时候少占用字节,码位大时多占字节

这个思想很简单,落地还是有问题要解决的,比如一个电脑接受到了多个字节,怎么知道某一个字节是一个字符,还是这个一个字节和下一个字节共同组成一个字符,如果没有一种方法去标识,还是会产生阅读误区

 误读

UTF-8的解决方案如下,定义了一套规则:

  • 如果是单字节代表一个字符,首位是0(控制位),剩余位是Unicode码(剩余7位),因此Unicode码位是7位以下的字符(编码十进制0 ~ 127)就可以用单字节传输,比如英文字符都符合7位以下,因此在utf-8中,英文字符占一个字节
A的UTF-8

由于英文占一一个字节,使得UTF-8可以完美兼容ASCII,这也是它被用的最广泛的原因

  • 如果是n字节代表一个字符,第一个字节n个1一个0开头作为控制位,其余字节以10开头作为控制位,所有字节的剩余位数合并代表Unicode值
    双字节如下:

    双字节
     

    其中黑色XXX存放的是Unicode,总共剩余共11位,11位最大值就是2047,所以127-2047码位的字符用占两个字节。
    三字节如下:

    三字节

     


    总剩余位16(最大65535),所2048-65535的字符占三个字节,汉字的Unicode在这个范围之中,所以现在懂为什么UTF-8的汉字占三个字节了吧~
一:UTF-8

六、GBK

因为讲了UTF-8,也不得不提一句GBK了,GBK是与Unicode共存的国产编码方式,全称是《汉字内码扩展规范》,它是我们自己国家定义的字符和二进制的逻辑映射(同一个汉字的Unicode和GBK的码位是不同的),而它的实现方式就比较固定了,用两个字节来代表一个字符

  • Unicode是从数字和字符之间的逻辑映射的概念编码,实现方式一般使用UTF-8这种可变字节的实现方式来避免浪费,也可以使用UTF-16用固定两个字节代表一个字符,还有其它实现方式如UTF-32
  • GBK编码系统可分为逻辑映射和实现方式两个层次,实现方式由于大部分是汉字所以固定两个字节代表一个字符,够用也不会有太多浪费

所以要说UTF-8和GBK到底谁好,也得分情况,如果大部分字符都是汉字,GBK两字节明显更节省空间(UTF-8因为要留控制位所以汉字需要三个字节),但如果大部分是英文显然UTF-8更节省,再有一点UTF-8实际存储的还是Unicode编码,全球都认,GBK属于国产编码,传送到国外还需要翻译,所以考虑国际化UTF-8还要更胜一筹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/370216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【多线程与高并发】- 浅谈volatile

浅谈volatile简介JMM概述volatile的特性1、可见性举个例子总结2、无法保证原子性举个例子分析使用volatile对原子性测试使用锁的机制总结3、禁止指令重排什么是指令重排序重排序怎么提高执行速度重排序的问题所在volatile禁止指令重排序内存屏障(Memory Barrier)作用volatile内…

验证性因子分析(CFA)全流程

案例与数据 某研究者想要研究关于教师懈怠感的课题,教师懈怠感是指教师在教育情境的要求下,由于无法有效应对工作压力与挫折而产生的情绪低落、态度消极状态,这种状态甚至会引发心理、生理的困扰,终至对教育工作产生厌倦&#xf…

实例8:机器人的空间描述和变换仿真

实例8:机器人的空间描述和变换仿真 实验目的 通过刚体与刚体的平动、转动基础知识的学习,熟悉位姿的描述通过Python编程实践,可视化学习坐标系的变换,熟悉空间变换 实验要求 建立一个原点位于零点的三维正交坐标系&#xff0c…

SQL零基础入门学习(十二)

SQL零基础入门学习(SQL约束) SQL CREATE INDEX 语句 CREATE INDEX 语句用于在表中创建索引。 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。 索引 您可以在表中创建索引,以便更加快速高效地查询数据。 用…

WooCommerce 上传文件 Vanquish v71.6

今天用wp 搭一个b2c外贸跨境电商网站 找 了一个文件上传插件,可以 上传无限数量的文件,没有文件大小限制WooCommerce 上传文件允许您上传无限数量的文件,没有任何文件大小限制。得益于其创新的块上传技术,它可以不受限制地上传任何…

【华为OD机试模拟题】用 C++ 实现 - 数据分类(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

记一次SSM项目启动过程中遇到的问题(找不到符号)

最近拿了朋友的SSM项目过来参考一下开发过程,然后我这边个人情况是没有学过Java的,环境也不太清楚,虽然之前有在学校过程中做过一个旅游网站类似的SSM项目,电脑环境配置还是有些不太了解,bug修了2天大概,然…

windows下编译leveldb(动态库+静态库)

环境准备 1)下载cmake并安装 下载路径: https://cmake.org/download/2)下载leveldb源码 git clone https://github.com/google/leveldb.git3)下载googletest和benchmark,cmake编译时需要 # 进入leveldb源码路径下的third_part…

干了2年的手工点点点,感觉每天浑浑噩噩,我的自动化测试之路...

作为一个测试人员,从业年期从事手工测试的工作是没有太多坏处的,当然,如果一直点来点去那么确实自身得不到提高,这时候选择学习自动化测试是一件很有必要的事情,一来将自己从繁重的重复工作中解放出来,从事…

操作系统——6.系统调用

目录 1.概述 2.系统调用的定义和作用 2.1 定义 2.2 功能 2.3 分类 3.系统调用和库函数的区别 4.系统调用背后的过程 5.小结 1.概述 这篇文章我们主要来介绍一下操作系统中的系统调用,下面来看一下具体的框架图: 2.系统调用的定义和作用 2.1 定…

Mysql索引学习

1. 索引 1.1 索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引…

Linux->进程优先级

目录 1. 优先级的概念 2. 优先级的运作方式 3. Linux下查看进程优先级以及调整 3.1 查看进程优先级 3.2 修改进程优先级 1. 优先级的概念 1. cpu资源分配的先后顺序,就是指进程的优先权(priority)。 2. 优先权高的进程有优先执行权利。配…

数据结构:二叉树概念篇(算法基础)

目录 一.有向树的图论基础 1.有向树的相关基本概念 有向树的基本定义: 有向树的结点的度: 有向树的度: 有向树的根结点,分枝结点,叶结点: 树的子树: 树结点的层次: 树的高度: 2.一个基本的数学结论 3.有序有向树 二.数据结构中树的顺序存储结构与链式存…

【华为OD机试模拟题】用 C++ 实现 - 星际篮球争霸赛(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【log】操作类日志处理 与 报错类日志处理logback

文章目录一、操作类日志处理【环绕增强】aop环绕增强导包第一步:自定义注解interface第二步:在Controller写一个测试的方法:第三步:编写LogAspect增强类与增强方法日志写入数据库(使用mybatis)第一步&#…

C/C++每日一练(20230225)

目录 1. 工龄问题求解 ★ 2. 字符图形输出 ★★ 3. LRU 缓存机制 ★★★ 1. 工龄问题求解 给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。输入首先给出正整数N,即员工总人数; 随后给出N个整数,即每个员工…

图像分割评价指标:Dice和MIoU

目录Dice理论代码MIou理论查准率 precison查全率 recallMIoU 平均交并比代码高效的矩阵运算低效的好理解的计算混淆矩阵Dice和MIoU两者的关系参考链接Dice 理论 Dice用来衡量预测结果pred和标签label的相似度,公式如下图所示,即两个集合的交集/并集。 …

Java-多线程-增强篇-锁强化第3篇

Java集合框架中的锁 今天我们继续来学习锁 字符串操作中的锁 String是线程安全的,因为使用final修饰Stringbuilder 是线程不安全的,其方法没有使用synchronized修饰StringBuffer 是线程安全的,其方法使用synchronized修饰 List集合中的锁 …

【人工智能 AI】可以从 RPA 中受益的 10 个行业 10 Industries That Can Benefit From RPA

目录 RPA技术介绍 Which industries can use robotic process automation?哪些行业可以使用机器人过程自动化? Robotic process automation in the retail industry零售业中的机器人过程自动化 Robotic process automation in the construction industry建筑行业的机器人…

RebbitMQ 消息队列(高级应用)

RabbitMQ 高级特性 消息可靠性投递,consumer ACK,消费端限流,TTL,死信队列,延迟队列,日志与监控,消息可靠性与追踪,管理 RabbitMQ 应用问题 消息可靠性保障,消息幂等性…