当前位置: 首页 > news >正文

字符编码发展史4 — Unicode与UTF-8

上一篇《字符编码发展史3 — GB2312/Big5/GBK/GB18030》我们讲解了ANSI编码中的GB2312/Big5/GBK/GB18030。本篇我们将继续讲解字符编码的第三个发展阶段中的Unicode与UTF-8。

2.3. 第三个阶段 国际化

前面提到的第二个阶段,各个国家和地区各自为政,纷纷制定了适用于自己国家语言的字符编码(统称为ANSI码),确实能解决该地区范围内语言文字的信息化处理。

随着互联网的普及和全球网络的互联互通,计算机的信息经常需要在全球范围内进行分享和传输。这时这些只兼容ASCII码互相之间却不兼容的字符编码就暴露了巨大的缺陷:编码混乱,这个混乱常体现在以下几点:

  1. 文本信息是一个国际化的内容,包含了多种不同的语言时,根本找不到一个合适的编码。如:你的内容里既有西欧的法语又中国的汉字,包含西欧语言的ISO 8859-1不支持中国的汉字,包含中国汉字的GB 18030不支持西欧的字符。
  2. 编码和解码使用的编码方式不一致时,会出现乱码。如以下两种场景:
  • 数据在网络传输时,数据发送用了A编码(假设是ISO 8859-1),数据接收时误用了B编码(假设是GB 18030)去解码,就会出现乱码。
  • 网上下载了一个纯文本的txt文档,里面保存内容的编码方式和本地计算机的默认编码不一致也会出现乱码。这时你可能还根本不知道这个文档采用的编码是什么,只能靠猜测,然后通过工具去手动转换编码格式。

为了解决ANSI系列编码的缺陷,使国际间信息交流更加方便,国际标准化组织(ISO)和统一码联盟(Unicode Consortium)共同制定的一个国际标准字符集:Unicode。Unicode为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

2.3.1. Unicode与UCS

2.3.1.1. 什么是Unicode与UCS?

这里讲一个冷知识,历史上存在两个独立的尝试创立单一字符集的组织,即 国际标准化组织(ISO)和统一码联盟(Unicode Consortium)。

  • 国际标准化组织 制定了UCS标准(全称Universal Character Set),最初称为ISO/IEC 10646。
  • 统一码联盟 制了Unicode标准,旨在解决不同字符编码之间的兼容性问题。

随着时间的推移,国际标准化组织和统一码联盟意识到各自的标准在目标上是一致的,因此决定合作,将UCS和Unicode合并为一个统一的标准。从Unicode 2.0开始,Unicode标准与ISO/IEC 10646标准保持同步,两者在字符集和编码方案上基本一致。

所以,你可以理解为:Unicode和UCS是同一个东西:国际标准字符集。现在几乎统一用Unicode一词,UCS用的越来越少了。

Unicode是一个字符集,不是编码方式,又称统一码万国码单一码标准万国码(其实都是同一个东西,不同的叫法)。它收集了世界上几十种文字系统,几乎包含了世界上用到的所有字符。截止2024年9月,Unicode的最新的版本是16.0.0,发布于2024年9月10日,总共收录了154,998个字符。Unicode 16.0.0标准的官方文档参见:https://www.unicode.org/versions/Unicode16.0.0/

Unicode的编码方式有三种:UTF-8、UTF-16、UTF-32。其中UTF-16、UTF-32又分为大端和小端两种。

2.3.1.2. Unicode字符集的码点编号

Unicode字符集给每个字符根据其所在的码点分配了一个唯一的码点值,即码点编号,也叫字符编号,格式为:U+XXXX,其中XXXX为四位十六进制数字。比如,U+0041这个码点编号,表示英语大写字母A

Unicode的编码空间将所有字符按照使用的频率划分为17个平面(plane),每个平面包含2^16(65536)个码位,将来根据需要,还可扩展为更多平面。17个平面的码位可表示为从U+0000U+10FFFF,共计1114112个码位。

第0个平面称为基本多语言平面(Basic Multilingual Plane),简称基本平面(BMP),或称第零平面(Plane 0),码点区间:U+0000~U+FFFF。它涵盖了当今世界上正在使用的最常用字符,我们平常用到的大多数常见字符,就是在BMP平面上。BMP平面以外的其他平面叫增补平面(Supplementary Planes),也称为辅助平面

Unicode字符集中的U+0000~U+007F(即十进制的0~127),跟ASCII表示的字符是一致的;U+0000~U+00FF(即十进制的0~255),跟ISO 8859-1字符集(即Latin-1字符集)也是一致的。所以Unicode的码点编号是兼容ASCII和ISO 8859-1的。

BMP平面中有一个私用区(即PUA:Private Use Area,或写作PUZ:Private Use Zone):0xE000~0xF8FF,共6400个码点,被保留为私用,Unicode官方未将之分配给任何Unicode字符。还有一个代理区(Surrogate Zone):0xD800-0xDFFF,共2048个码点,代理区的码点不定义任何字符,目的是用基本平面BMP中的两个码点“代理”表示BMP以外的其他增补平面中的字符(后文UTF-16中会详细讲解)。

Unicode实际上共定义了三个私用区,除了上面提到的BMP的0xE000~0xF8FF,还有两个分别是:第15平面的U+F0000~U+FFFFD和第16平面的U+100000~U+10FFFD,这两个私用区几乎包含了整个第15平面和第16平面。私用区相当于是可以由Unicode官方之外的个人和机构自由定义字符的特殊区域,因此私用区中的同一个码点,可被分配给不同的字符,具体是哪个字符,取决于用户使用的字体文件,从而导致不同的用户由于安装了不同的字体文件,有可能所看到的私用字符也不同。

2.3.2. Unicode的编码方式

对于被Unicode收录的字符其编号(即码点编号)是唯一且确定的。但是Unicode的编码实现方式(出于传输、存储、处理或向后兼容的考虑)却有不同的几种:UTF-8、UTF-16、UTF-32。其中UTF的全称是:Unicode Transformation Format,表示“Unicode码转换格式”。其中8/16/32分别表示8位(1字节)/16位(2字节)/32位(4字节),表示一个字符进行编码所需的最小字节单元,也称编码单元,简称码元

2.3.2.1. UTF-8
1. UTF-8的编码规则

UTF-8是一种变长编码,对于一个Unicode的字符被编码成1至4个字节。Unicode编码与UTF-8的编码的对应关系如下表。

Unicode编码十进制表示UTF-8编码(二进制)
U+0000 – U+007F0 ~ 1270xxxxxxx
U+0080 – U+07FF128 ~ 2047110xxxxx 10xxxxxx
U+0800 – U+FFFF2048 ~ 655351110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF65536 ~ 209715111110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0、110、1110、11110以及10相当于UTF-8编码中各个字节的前缀,因此称之为前缀码。他们的含义分别如下:

  • 0: 表示单字节编码,单字节时表明该字符是一个ASCII字符。
  • 110: 表示双字节编码,出现在双字节编码的首字节。
  • 1110: 表示三字节编码,出现在三字节编码的首字节。
  • 11110: 表示四字节编码,出现在四字节编码的首字节。
  • 10: 表示该字符是一个多字节编码(2、3、4字节),10是多字节编码中非首字节的前缀。

UTF-8编码中的前缀码起到了很好的区分和标识的作用,其编码的解析过程大致如下:

  1. 当解码程序读取到一个字节的首位为0,表示这是一个单字节编码的ASCII字符;
  2. 当读取到一个字节的首位为1,表示这是一个非ASCII字符的多字节编码字符中的某个字节(可能是首字节,也可能是后续字节),接下来若继续读取到一个1,则确定为首字节,再继续读取直到遇见终结标志0为止,读取了几个1,就表示该字符为几个字节的编码;
  3. 当读取到一个字节的首位为1,紧接着读取到一个终结标志0,则该字节显然是非ASCII字符的后续字节(即非首字节)。

在UTF-8编码方式中,绝大部分的中文用三个字节编码,部分中文用四个字节编码,举例如下:

Unicode字符UTF-8编码
U+0041A0x41
U+03A9Ω0xCE 0xA9
U+66530xE6 0x99 0x93
U+2A6A5𪚥(四个龍)0xF0 0xAA 0x9A 0xA5
2. UTF-8的优缺点
  • 优点:
    • 向后兼容ASCII编码;
    • 没有字节序(大小端)的问题适合网络传输;
    • 存储英文和拉丁文等字符非常节省存储空间。
  • 缺点:
    • 变长编码不利于文本处理;
    • 对于CJK等文字比较浪费存储空间。

未完待续…… 欲知后事如何,且看下回分解。

下回预告:字符编码发展史5 — UTF-16和UTF-32。

历史文章推荐:

字符编码发展史3 — GB2312/Big5/GBK/GB18030

字符编码发展史2 — ISO-8859-N

字符编码发展史1 — ASCII和EASCII


大家好,我是陌尘。

IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。

搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。

感谢大家的关注,期待与你一起成长。



【SunLogging】
扫码二维码,关注微信公众号,精彩内容

相关文章:

字符编码发展史4 — Unicode与UTF-8

上一篇《字符编码发展史3 — GB2312/Big5/GBK/GB18030》我们讲解了ANSI编码中的GB2312/Big5/GBK/GB18030。本篇我们将继续讲解字符编码的第三个发展阶段中的Unicode与UTF-8。 2.3. 第三个阶段 国际化 前面提到的第二个阶段,各个国家和地区各自为政,纷纷…...

【flink】之如何消费kafka数据并读写入redis?

背景&#xff1a; 最近公司出现做了一个新需求&#xff0c;需求内容是加工一个营销时机&#xff0c;但是加工营销时机的同时需要把数据内容里的一个idmapping存入redis用于后续的读写。 准备&#xff1a; <!-- 依赖 --><dependency><groupId>org.apache.fl…...

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(二)-索引

场景 首先介绍测试的场景&#xff0c;本系列schema定义 pdm文档索引&#xff0c;包括nested&#xff0c;作为文档扩展属性字段&#xff0c;_content字段是组件保留字段&#xff0c;支持文本内容&#xff0c;字段属性还有其他属性&#xff0c;如boost&#xff0c;getter&#x…...

离散化算法

离散化 在C中&#xff0c;离散化通常指的是将连续的数值或数据转化为离散的形式。这在数值分析、信号处理、图像处理和机器学习等领域都非常常见。以下是一些离散化的基本概念和方法&#xff1a; 1.区间划分&#xff1a; 将连续变量的值域分成多个区间&#xff0c;每个区间对…...

基于ollama的本地RAG实践

先放参考的原文链接大语言模型实战——搭建纯本地迷你版RAG_本地rag-CSDN博客 一、大模型选择 在我之前的文章中有讲到&#xff0c;我用的是ollama中的llama3.1 Ollama在Windows安装&#xff0c;使用&#xff0c;简单调用API_ollama如何对外提供api-CSDN博客 二、嵌入模型 …...

安卓开发板_MTK开发板_联发科开发评估套件Demo板接口介绍

开发板是一种功能丰富的电路平台&#xff0c;专为开发人员设计&#xff0c;集成了多种传感器、扩展接口和通信模块。这使得开发者能够高效进行原型设计和功能验证&#xff0c;极大地简化了软硬件开发的过程。 此次介绍的安卓开发板由MT8788核心板与底板构成&#xff0c;特别之处…...

代码随想录冲冲冲 Day58 图论Part9

47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; 根据昨天的dijkstra进行堆优化 使用的原因是点多但边少 所以直接对于边进行操作 1.对于priority_queue来说 这是最小堆, 小于的话就是最大堆 之后由于是根据边来说的 所以新建一个Edge并且初始化一下 之后由于使用…...

UnityHub下载任意版本的Unity包

1)先打开 // 也可以采用2直接打开 2)也可以直接打开 下载存档 (unity.com) 3)关联起来UnityHub即可...

网站服务器怎么计算同时在线人数?

网站服务器计算同时在线人数通常涉及跟踪和记录当前活跃会话的数量。以下是几种常用的方法来估算或计算网站的同时在线人数&#xff1a; 1. 会话跟踪 - 基于会话(Session)&#xff1a;服务器可以为每个访问者创建一个会话&#xff0c;并跟踪这些会话。当访问者首次访问网站时&a…...

[spring]MyBatis介绍 及 用MyBatis注解操作简单数据库

文章目录 一. 什么是MyBatis二. MyBatis操作数据库步骤(使用注解)创建工程创建数据库创建对应实体类配置数据库连接字符串写持久层代码单元测试 三. MyBatis基础操作 使用注解打印日志参数传递增删改查 一. 什么是MyBatis 简单来说 MyBatis 是更简单完成程序和数据库交互的框架…...

Ks渲染做汽车动画吗?汽车本地渲染与云渲染成本分析

Keyshot是一款强大的实时光线追踪和全域光渲染软件&#xff0c;它确实可以用于制作汽车动画&#xff0c;包括汽车模型的渲染和动画展示。Keyshot的动画功能允许用户创建相机移动、物体变化等动态效果&#xff0c;非常适合用于汽车动画的制作。 至于汽车动画的渲染成本&#xff…...

AI智能时代:哪款编程工具让你的工作效率翻倍?

引言 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程工具让你的工作效率翻倍&#xff1f;是智能的代码编…...

这五本大模型书籍,让你从大模型零基础到精通,非常详细收藏我这一篇就够了

大模型&#xff08;Large Language Models, LLMs&#xff09;是近年来人工智能领域的一大热点&#xff0c;它们在自然语言处理、对话系统、内容生成等多个方面展现出了强大的能力。随着技术的发展&#xff0c;市面上出现了许多介绍大模型理论与实践的书籍&#xff0c;为研究人员…...

面试经典150题 堆

215.数组中的第K个最大元素 建堆算法实现-CSDN博客 215. 数组中的第K个最大元素 中等 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必…...

day-62 每种字符至少取 K 个

思路 滑动窗口&#xff1a;改变思路&#xff0c;从左右两边取字符&#xff0c;是a b c三个字符至少被取k次&#xff0c;那么意味着如果我们知道字符串中a b c的出现个数&#xff0c;那么可以知道取走后剩下子串a b c的个数&#xff0c;问题转化为了求最长子串 解题过程 如果a …...

免费好用!AI声音克隆神器,超级简单,10秒就能克隆任何声音!(附保姆级教程)

今天下午还有读者问&#xff1a; 有没有能克隆声音的 AI 工具&#xff1f; 其实剪映很早就上了克隆声音的功能。 只需要按要求朗读例句&#xff0c;或者上传本地的音视频文件&#xff0c;就可以克隆声音了。 操作非常简单&#xff0c;效果也不错&#xff0c;可以试试。 除了…...

LeetCode146 LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …...

【Java】包装类【主线学习笔记】

文章目录 前言包装类基本数据类型与包装类之间的转换基本数据类型转换为包装类可以通过以下几种方式&#xff1a;包装类转换为基本数据类型可以通过以下几种方式&#xff1a;初始化值不同与String之间的转换 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台…...

华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?

场景介绍 本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等&#xff0c;并可以通过信息窗口展示详细信息。 点注释支持功能&#xff1a; 支持设置图标、文字、碰撞规则等。支持添加点击事件。 PointAnnotation有默认风格&#xff0c;同时也支持自定…...

uniapp js怎么根据map需要显示的点位,计算自适应的缩放scale

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...