UTF-8编码

news2024/10/9 16:22:37

阅读该文章之前,请阅读以下两篇文章,了解GBK编码和Unicode编码:

GBK编码的理解_sgmcy的博客-CSDN博客

Unicode编码的理解_sgmcy的博客-CSDN博客

UTF的意思是:Unicode Transformation Format 。也就是Unicode 转换格式。可见,UTF编码与Unicode关系是密不可分的。

之前介绍Unicode的时候,介绍Unicode是采用24bit的数据,对全世界所有的字符进行编码。其中,第一个字节是面“page”,第二个和第三个字节是具体的“码”。

地球上,大概有6900多种语言,这么多种语言的文字,大部分都放在了第一个平面立面。包括英文、中文等。其他的生僻字,用的少的,放在了其他的平面内,如平面1

Unicode 是唯一编码表。 这个唯一编码表,确定了每个字符对应的Unicode的“码”值。

但是,Unicode仅仅是确定了一个行业标准,并没有规定它的实现方式——即没有规定它在内存中是如何存储的

Unicode是采样24bit来存储各个字符的“码”值的,但是,我们知道,计算机内部,最小的存储单元是1个字节(char类型),或者存储类型是2个字节(short 类型)或者是4个字节(int类型)或者是8个字节(double类型)

计算机底层存储没有3个字节的存储变量,即没有一个变量是用来存储24bit的数据的。

这时候,有人会说,既然没有3个字节的存储变量,那么我们就直接用4字节的int类型变量来存储不就可以了嘛!

用4字节来存储,会有两个问题:

第一个问题,是浪费存储空间

第二个问题,就是计算机底层实现有大小端的问题

对于第一个问题,以前计算机存储空间都是十分紧缺的,我之前上大学的时候,我们老师就给我们讲,说当时他的领导,给了他30多万的经费,让他买个海量存储器回来,结果这个所谓的海量存储器,就10M左右。

当然,现在的半导体制造技术成熟了,一个小小的U盘都能制作达到128G。

但是,有些国家就不服了,比如美国。美国心想,我ASCII码多牛逼,只需要1个字节就可以存储的玩意,用了你所谓的Unicode码,一下子内存空间占用扩展了4倍,我不愿意。

对,凭什么一个字节就可以存储的东西,需要使用4倍的存储空间存储?

第二个问题,就是大小端的问题。具体的大小端的概念,请百度查询。

比如,现在不考虑存储空间的问题,就用32bit 4字节的东西来存放24bit的Unicode码。假设一个字符的Unicode的编码是0x00 01 AA BB ,

存储到第一种计算机里面的时候,它的存储格式是0x00 01 AA BB

存储到第二种计算机里面的时候,它的存储格式是0xBB AA 01 00

在解析的时候,如果不考虑这个大小端存储的问题 ,那么读取内存中这个数值再解码成Unicode码,就会出现出错。

总之:Unicode就是制定了标准协议,但是没有规定这个标准协议是如何实现的,没有规定这个Unicode码在内存中具体怎么存储的

所以,这时候,就出现了UTF :Unicode Transformation Format

也就是说,UTF是Unicode的一种实现方式。它实现了一种转换方式,即,把用户存储在内存中的数值,读取出来,再通过一系列的转换规则,转换成Unicode的数值,这样就可以得到对应的字符了。

UTF有好多种实现方式。

比如UTF-32就是采用32bit来实现存储24bit的Unicode码值。

当然还有UTF-16,是采用16bit来存储

当然还有UTF-8采用8bit来存储。

当然还有UTF-7 ,UTF-7.5,即采用7个bit或者7.5个bit来实现Unicode的存储。

当然,使用最广泛的,还是UTF-8

例子:UTF-32就是采用32bit来存储Unicode的码值的。

假设,一个Unicode的码值是0x00 AB CD,那么存储在内存中的码值,就是0x00 00 AB CD 或者0xCD AB 00 00 。不管是大小端,总之,程序能判断电脑系统是采用大端存储还是小端存储,判断出了是大端小端存储,再把UTF-32转换成Unicode的值,就可以得到对应的字符了。

UTF-16也是类似。大部分的Unicode的码值都是在第一个平面内部的,也就是处在的范围是在0x0000~0xFFFF之间。所以UTF-16这个标准就会判断Unicode的码值,如果在65535范围内,就采用两个字节存储,如果是在第一个平面以外的字符,就采用4个字节存储。

当然,不管采用两个字节存储还是采用4个字节存储,也还是会面临大小端的存储问题。(虽然两个字节的存储,已经节约了2个字节了。)

UTF-8是按照8bit来存储。

 

对于Unicode的数值在0~127范围内的,那就是标准的ASCII码值,就直接采用一个字节存储。如果是在128~2047范围内,就采用两个字节存储。。。。。如上图所示。

当然,UTF-8在转换Unicode的码值时,还会根据Unicode的码值所处的范围,把最高字节设置为0,或者设置为11,设置为111,设置为10.。。。。

这个其实就是一种转换规则而已。程序上是可以实现的。

而对于我们普通程序员用户而言,可以不需要理解这个转换规则,我们只要知道的是,在写代码的时候,我们告诉程序,我们支持的是UTF-8字符集,底层就可以实现这种UTF-8数值——Unicode码值的转换,就可以自动帮我们得到对应的想要的字符。

由于UTF-8是按照一个字节来存储的,所以,也就不存在所谓的大小端的问题。

这也是UTF-8使用最为广泛的原因之一

当然,历史上还有UTF-7和UTF-7.5,就不表述了。

所以,一般在写python代码的时候,为了增加中文字符集的支持,一般都要声明一下,python采用utf-8编码,这样就不会出现乱码了。

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

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

相关文章

python初级教程七 JSON 数据解析

JSON 数据解析 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。 Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: json.dumps(): 对数据进行编码。 json.loads(): 对数据进行解码。 在 json 的编解码过程…

【数据结构】C语言实现双链表

目录 前言 双链表节点定义 接口函数实现 初始化函数 创建节点 打印双链表 尾插节点 尾删节点 头插节点 头删节点 指定位置前插入 删除指定位置节点 改写插入删除 判断链表是否为空 计算链表长度 销毁链表 双链表完整代码 浅谈链表及顺序表 前言 前面我们已经实…

Speed and Memory Efficient Dense RGB-D SLAM in Dynamic Scenes论文笔记

Speed and Memory Efficient Dense RGB-D SLAM in Dynamic Scenes论文笔记 论文中的主要引用文献: [7:A coarse and relevant 3d representation for fast and lightweight rgb-d mapping] 超表元建图 [14: Fast optical flow using dense inverse search] 稠密光流…

后端Web开发框架(Java)

为什么使用Spring Boot 简化配置,无需编写太多的 xml 配置文件,效率很高;Spring 可以整合很多各式各样的框架,并能很好的集成;基于 Spring 构建,使开发者快速入门,门槛很低;Spring …

LabVIEW调用自己写的DLL

首先,我用的LabVIEW是8.5版本的,比较老但工作需要 先新建VI 程序框图中选择 互连接口 - 库与可执行程序 选择 调用库函数… 拖到面板 并右击它 选择配置 在库名或路径中选择写好的DLL方案中的DEBUG中dll文件 确定以后就要选择哪个函数,并…

【数字图像处理】毛笔字细化

源码链接:calligraphy.cpp 一、实验要求 附件是书法毛笔字,请将附件图片中“年少有为”四个字进行笔画细化。 二、实验内容 首先观察图片,是只将黑色的毛笔字部分进行细化,所以需要先把印章这类的区域去除。先通过将图片转到h…

Content Security Policy (CSP) 介绍

内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。 起因 当我不经意间在 Twitter 页面 view source…

JavaScript 简单类型与复杂类型

JavaScript 简单类型与复杂类型 目录JavaScript 简单类型与复杂类型1. 简单类型与复杂类型2. 堆和栈3. 简单类型的内存分配4.复杂类型的内存分配5. 简单类型传参6. 复杂类型传参7.下面是代码1、Math对象最大值2. 封装自己的数学对象3. Math绝对值和三个取整方法4.Math对象获取随…

WebSocket实现聊天室

需求 实现用户登录功能展示用户好友列表功能实现用户历史消息展示实现单聊信息和群聊信息 效果展示 用户登录 好友列表展示 历史消息展示 聊天 代码实现 说明&#xff1a;Springboot项目&#xff0c;页面是用 thymeleaf 整合的。 maven依赖 <dependencies><depen…

π122E31兼容ISO7221CD 200Mbps高速率 双通道数字隔离器

π122E31兼容ISO7221CD 200Mbps高速率 双通道数字隔离器&#xff0c;具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 3.0kVrms 隔离耐压等级和 DC 到…

MySQL数据库的安装与实现

MySQL在win系统中的安装 第1步&#xff1a;下载安装&#xff08;在windows系统中安装&#xff09; http://downloads.mysql.com/archives/community/ 我选择安装的是5.7.31&#xff0c;一般MySQL主要分为两个版本&#xff0c;一个是5.7系列&#xff0c;一个是5.8系列&#xf…

Linux 音频驱动

1 I.MX6ULL 开发板通过此接口外接了一个 WM8960 音频 DAC 芯片。 2 在信号处理领域&#xff0c;外界的声音是模拟信号&#xff0c;处理器能理解的是数字信号&#xff0c;因此这里就涉及到一个模拟信号转换为数字信号的过程&#xff0c;而完成这个功能的就是 ADC 芯片。 如果处…

MySQL的锁

把那些可能会被多个线程同时操作的资源称为临界资源&#xff0c;加锁的目的就是让这些临界资源在同一时刻只能有一个线程可以访问。数据库作为用户共享的一个资源&#xff0c;如何保证数据并发访问一致性也是所有数据库必须解决的问题&#xff0c;如何加锁是数据库并发访问性能…

字节前端高频手写面试题(持续更新中)

Promise // 模拟实现Promise // Promise利用三大手段解决回调地狱&#xff1a; // 1. 回调函数延迟绑定 // 2. 返回值穿透 // 3. 错误冒泡// 定义三种状态 const PENDING PENDING; // 进行中 const FULFILLED FULFILLED; // 已成功 const REJECTED REJECTED; // 已…

Vite构建工具

什么是构建工具&#xff1a;打包:将我们写的浏览器不认识的代码交给构建工具进行编译处理的过程就叫做打包&#xff0c;打包完成以后会给我们一个浏览器可以认识的文件 一个构建工具他到底承担了哪些脏活累活: 1. 模块化开发支持:支持直接从node_modules里引入代码&#xff0b…

十三、Kubernetes yaml资源清单详解

1、概述 kubectl提供了各种命令&#xff0c;来管理集群中的pod&#xff0c;但是这些命令都是为了方便运维测试&#xff0c;实际生产部署还得用yaml文件来部署&#xff0c;所以弄清楚各类资源的字段是非常重要的。 资源清单就是k8s当中用来定义pod的文件&#xff0c;语法格式遵…

C#语言实例源码系列-实现ID卡的识别

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

Vlan的原理与配置

传统以太网的问题 规模大了&#xff0c;之后导致性能也很差&#xff0c;广播会增加 解决&#xff1a;用Vlan&#xff0c;不受地域限制&#xff0c;同一Vlan内的设备才能直接进行二层通信 实验 首先配置以上vlan与电脑ip 配置IP之后可以进行ping命令测试刚开始是连通的&#x…

计算机视觉实战----AlexNet网络及使用colab跑YoloV5代码

系列文章目录 文章目录系列文章目录前言一、用colab薅羊毛二、使用百度飞浆操作三、二、使用步骤1.引入库2.读入数据总结前言 一、用colab薅羊毛 Colaboratory 简称“Colab”&#xff0c;是 Google Research 团队开发的一款产品。在 Colab 中&#xff0c;任何人都可以通过浏览…

分享107个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1Su77mBUx87vk0lzSLyvnyw?pwdyo96 提取码&#xff1a;yo96 PHP源码 分享107个PHP源码&#xff0c;总有一款适合您 page_count 1 # 每个栏目开始业务content"text/html; charsetgb2312"base_url "https://down.c…