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

计算机字符编码的发展

目录

背景

发展

第一阶段:ASCII编码

第二阶段:扩展ASCII编码

第三阶段:各国编码

第四阶段:Unicode编码

第五阶段:UTF系列编码方式

相关扩展


背景

在计算机诞生初期,所有的数据都是基于二进制数(0和1)来表示的。如果人类直接操作二进制数据会出现很多问题(如可读性差、易出错等),为了解决这个问题(让计算机能够理解和处理人类语言),方便人类使用计算机,一种相关技术就应运而生,这就是字符编码(一套将人类语言转换为二进制数据的规则或系统)。


发展

第一阶段:ASCII编码

遇到的问题:在计算机发展的早期,当时计算机开始普及并需要进行字符的传输和存储。然而,由于各种计算机系统和程序使用的字符表示方式不尽相同,导致文本数据在交换和处理时容易出现混乱和错误。

解决方案:为了解决不同计算机系统之间字符编码不一致的问题,ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)就此诞生。

PS:字符编码中最小的存储单位是字节,而标准ASCII只使用了7位(最高位为0)。标准ASCII只能表示128个不同的字符(主要用于表示英文字符、数字、标点符号和控制字符等)。


第二阶段:扩展ASCII编码

遇到的问题:由于计算机最初是由美国人发明的,因此ASCII编码主要基于英文字符集进行设计。如果计算机只在美国使用的话,也没有什么太大的问题,但是后来其它国家也开始使用计算机的时候,发现它们国家里面的字符根本不在这128个字符里面。

解决方案:其它国家在原有的ASCII码基础上进行扩展,就是将原来二进制数最高位的0变为1,也就是从128扩展到255(等于新增的128个字符)对应ASCII码叫作扩展ASCII码。通过对ASCII码的扩展,似乎解决了一些欧洲国家的字符编码问题。


第三阶段:各国编码

遇到的问题:随着计算机应用的全球化和多语言环境的出现,各国因语言不同,标准的ASCII编码已不满足。而扩展ASCII码并没有一个统一的国际标准,因此不同的系统、平台或编程语言可能采用不同的扩展ASCII码表。这可能会导致在不同环境之间交换文本数据时出现字符编码不兼容的问题。

解决方案:各国开始发展自己的字符编码标准,以满足本国语言和字符的表示需求。这些编码标准通常与ASCII码和扩展ASCII码有所不同,并具有更大的字符集和更复杂的编码规则。

PS:我国与之对应的编码是GB2312字符编码和对GB2312进行扩充的GBK字符编码等主要用于表示中文字符。其中GBK编码于1995年12月正式发布。


第四阶段:Unicode编码

遇到的问题:随着全球化的进一步推进,各国之间的信息交流愈加的频繁,而各国编码并没有一个统一的国际标准,各种编码标准之间产生冲突和乱码问题。

解决方案:需要一种能够统一表示全球各种字符的编码方案,以解决各国编码带来的兼容性问题。这个时候提出了Unicode(统一码、万国码、单一码)这样的一个标准。Unicode标准定义了世界上几乎所有书写系统中的字符的码点(code points),即给每个字符分配了一个唯一的数字标识符(通常是一个16位或32位的整数)。

PS:Unicode只定义了字符的码点,相等于是一个标准的字符集。具体的字符编码取决与使用的Unicode的编码方式。

Unicode最初编码方式的演变:

因Unicode编码本身并不直接指定这些码点如何存储在计算机中,最初的它使用16位(即固定的两个字节)的编码空间,采用了类似UCS-2固定宽度的编码方式。但由于字符数量的增加,最多只能表示65,536个(2^16)不同的字符,需要表示的字符数量远远超出了16位所能表示的范围。(主要概况就是:设计的局限性显现)

为了解决16位编码空间的局限性,Unicode标准引入了两种主要的解决方案:

  1. 类似于UCS-4编码方式:即使用更多的位数(通常是32位或4个字节,也就是将近43亿[2^32])来表示每个字符,从而扩大编码空间。这种方式基本上就能涵盖世界上所有的字符了。但是这样的编码规则并没有被世界各国很好的接受,因为这种方式会增加存储和传输的成本(每个字符固定了4个字节)。
  2. 支持额外的机制:在保留16位编码空间的同时,引入额外的机制来表示超出16位编码范围的字符。这主要通过使用“代理对”(surrogate pairs)来实现,即使用两个16位的编码单元来表示一个超出基本多语言平面(BMP)的字符。这种方式能够在不大幅增加存储和传输成本的前提下,支持更多的字符。但这种方式会使得编码和解码过程变得复杂。

补充:在Unicode字符集的发展历史中,有两个主要的组织或项目在推动单一字符集的创建:国际标准化组织(ISO)于1984年创建的通用字符集(Universal Character Set, UCS),这后来由ISO 10646(或称ISO/IEC 10646)标准所定义;另一个是由一些软件制造商(如Xerox、Apple等)于1988年成立的Unicode团队。这两个项目在初期是独立的,但随着时间的推移,他们意识到世界不需要两个不兼容的字符集,因此开始合并双方的工作成果,为创建一个单一编码表而协同工作(从Unicode 2.0开始,Unicode的编码与ISO/IEC 10646标准(UCS)实现了一致,两者共享相同的字符编码和字符集)。随着技术的发展和标准化工作的推进,现编码中UCS编码已经合并到Unicode编码中了。

这里再补充一个点:UCS字符集包含UCS-2编码方式和UCS-4编码方式,UCS的开发进度快于Unicode,1990年就公布了第一套编码方法UCS-2。后续Unicode在1996年7月公布,明确宣布是UCS-2的超集。


第五阶段:UTF系列编码方式

介绍:因Unicode编码本身并不直接指定这些码点如何存储在计算机中,它定义了多种编码形式,其中UTF(Unicode Transformation Format)系列是一种用于编码Unicode字符集的字符编码方式。

遇到的问题:虽然Unicode字符集包含了全球各种字符,但最初编码方式存在的问题,如编码长度固定和不同编码方式之间的冲突,限制了存储和传输效率。所以说Unicode标准推出了很长一段时间,并没有被广泛接受,直到后面互联网时代的来临,各国之间的信息交流愈加的频繁,这时候不得不对编码进行重新思考。

解决方案:为了解决这些问题,UTF系列编码方式应运而生,其中最具代表性的是UTF-8。

UTF系列,全称为Unicode Transformation Format,是用于表示Unicode字符集的一种字符编码方式。UTF系列包括UTF-8、UTF-16和UTF-32三种主要编码类型,每种类型都有其特定的应用场景和优势。

以下是关于UTF系列的详细说明:

  • UTF-8
    • 特点:一种可变长度的Unicode编码方式,优点之一是节省空间,它使用1到4个字节来编码Unicode字符。UTF-8编码在表示ASCII字符时与ASCII编码兼容,即ASCII字符在UTF-8中的编码与它们在ASCII中的编码相同,都是单个字节。这使得UTF-8在处理以ASCII字符为主的文本时具有更高的效率。
    • 使用场景:广泛应用于互联网和计算机系统中,如网页编码、文件存储等。
  • UTF-16
    • 特点:UTF-16可以看作是UCS-2的父集(源于UCS-2)。它是固定或可变长度的,取决于字符的Unicode代码点。在没有辅助平面字符之前,UTF-16与UCS-2是相同的,都使用两个字节表示字符。但是,当引入辅助平面字符后,UTF-16扩展为能够表示更多字符的编码方式。( UTF-16 通常使用 2 个字节来编码字符,但当遇到辅助平面内的字符时,它需要使用 4 个字节(两个 16 位单元)来编码。这种设计使得 UTF-16 在处理常用字符时非常高效(只需要 2 个字节),同时又能支持整个 Unicode 字符集。然而,这也使得 UTF-16 的编码长度不是完全固定的,需要根据具体的字符来确定)
    • 使用场景:操作系统、编程语言、数据库等需要表示Unicode字符的场景,特别是在Windows操作系统中,UTF-16是默认的字符编码方式。
  • UTF-32
    • 特点:始终使用固定长度4个字节表示一个Unicode字符。这种编码方式对于处理Unicode字符非常直接,但可能会浪费存储空间。(UTF-32与UCS-4在编码方式上非常相似,都是使用四个字节的固定长度来表示每个字符)
    • 使用场景:需要严格区分字符和编码的场景,如文本编辑器、网页开发等。

至此,以上就是字符编码的大致发展历程。


相关扩展

  • 字符编码是编码的一个子集。
  • 字符编码整个过程包括字符集、码点、编码方式、编码、解码。
    • 字符集是整个字符编码的基础,表示该字符编码中所有字符的集合。
    • 码点是字符集为每个字符分配的一个唯一的数字编号作为码点,用于在计算机中唯一标识该字符。
    • 用于将字符映射到特定的字节序列称为编码方式(是一种映射规则)。
    • 编码是将字符转为二进制数的过程。
    • 解码是编码的逆过程,将二进制数转为字符。
  • 每一种字符编码都有一种字符集和码表(Unicode字符集有多种编码方式)。
  • 使用不同编码方式进行编码和解码会产生乱码。
  • UTF-8编码中文需要占3个字节,GBK编码中文需要占2个字节。【因UTF-8编码和GBK编码都兼容了ASCII编码,所以对于ASCII字符(包括英文字母、数字和一些标点符号)使用1个字节】

相关文章:

计算机字符编码的发展

目录 背景 发展 第一阶段:ASCII编码 第二阶段:扩展ASCII编码 第三阶段:各国编码 第四阶段:Unicode编码 第五阶段:UTF系列编码方式 相关扩展 背景 在计算机诞生初期,所有的数据都是基于二进制数&am…...

Java(六)——抽象类与接口

文章目录 抽象类和接口抽象类抽象类的概念抽象类的语法抽象类的特性抽象类的意义 接口接口的概念接口的语法接口的特性接口的使用实现多个接口接口与多态接口间的继承抽象类和接口的区别 抽象类和接口 抽象类 抽象类的概念 Java使用类实例化对象来描述现实生活中的实体&…...

【4.vi编辑器使用(下)】

一、vi编辑器的光标移动 二、vi编辑器查找命令 1、命令::/string 查找字符串 n:继续查找 N:反向继续查找 /^the 查找以the开头的行 /end 查找以 查找以 查找以结尾的行 三、vi编辑器替换命令 1、语法: : s[范围,范围]str1/str2[g] g表示全…...

【数据结构】探索树中的奇妙世界

专栏介绍: 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累…...

搭建YOLOv10环境 训练+推理+模型评估

文章目录 前言一、环境搭建必要环境1. 创建yolov10虚拟环境2. 下载pytorch (pytorch版本>1.8)3. 下载YOLOv10源码4. 安装所需要的依赖包 二、推理测试1. 将如下代码复制到ultralytics文件夹同级目录下并运行 即可得到推理结果2. 关键参数 三、训练及评估1. 数据结构介绍2. 配…...

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…...

java面试中高频问题----1

一、乐观锁和悲观锁定义、场景怎么判断用什么&#xff1f; 1.乐观锁&#xff1a; 定义&#xff1a;乐观锁假设大多数情况下&#xff0c;资源不会发生冲突。因此&#xff0c;允许多个线程同时访问资源。 场景&#xff1a;读操作多&#xff0c;写操作少&#xff0c;数据冲突概率…...

ABB 控制柜

1&#xff0c;主计算机&#xff1a;相当于电脑的主机&#xff0c;用于存放系统和数据&#xff0c;需要24V直流电才能工作。执行用户编写的程序&#xff0c;控制机器人进行响应的动作。主计算机有很多接口&#xff0c;比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴…...

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL_PARSE_FAILED_USESDK_ERROR )

文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…...

使用C语言openssl库实现 RSA加密 和 消息验证

Q&#xff1a;什么是RSA&#xff1f; A&#xff1a;RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是一种非对称加密算法&#xff0c;是最早的一种用于公开密钥加密和数字签名的算法。它使用一对公钥&#xff08;public key&#xff09;和私钥&#xff08;private key&…...

海外投放面试手册

海外投放面试手册 岗位职责&#xff1a; 负责Google 、Facebook、TikTok、Twitter等海外主流广告平台的自主投放操作及合作渠道沟通&#xff1b;负责海外合作渠道媒体的广告投放管理、媒体数据监测、效果分析、优化调整等工作&#xff1b; 3&#xff0e;了解海外各渠道&…...

第十三章 进程与线程

第十三章 进程与线程 程序与进程的概念 程序&#xff1a; 英文单词为Program&#xff0c;是指一系列有序指令的集合&#xff0c;使用编程语言所编写&#xff0c;用于实现一定的功能。 进程&#xff1a; 进程则是指启动后的程序&#xff0c;系统会为进程分配内存空间。 函数式…...

Flink面试整理-对Flink的高级特性如CEP(复杂事件处理)、状态后端选择和调优等有所了解

Apache Flink 提供了一系列高级特性,使其成为一个强大的实时数据处理框架,特别适用于复杂的数据处理场景。其中,复杂事件处理(CEP)、状态后端的选择和调优是其中重要的几个方面。 复杂事件处理(CEP) CEP 概念:CEP 是用于在数据流中识别复杂模式的技术。它允许用户指定事…...

算法:树状数组

文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…...

Kafka SASL_SSL集群认证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka SASL_SSL安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详…...

同城交友论坛静态页面app Hbuild

关注...

spring session+redis存储session,实现用户登录功能,并在拦截器里面判断用户session是否过期,过期就跳转到登录页面

在Spring应用中&#xff0c;使用Redis存储Session是一种常见的方式&#xff0c;可以实现分布式环境下的Session管理。以下是实现用户登录功能&#xff0c;并在拦截器中判断Session是否过期并跳转到登录页面的基本步骤&#xff1a; 添加依赖&#xff1a;首先&#xff0c;确保你的…...

Debug-013-el-loading中显示倒计时时间

前言&#xff1a; 今天实现一个小小的优化&#xff0c;业务上是后端需要从设备上拿数据&#xff0c;所以前端需要不断调用一个查询接口&#xff0c;直到后端数据获取完毕&#xff0c;前后端根据一个ending字段为true判断停止调用查询接口。由于这个查询时间比较久&…...

5月29日,每日信息差

第一、据悉&#xff0c;微信视频号直播电商团队将并入到微信开放平台&#xff08;小程序、公众号等&#xff09;团队&#xff0c;原微信视频号直播电商团队转由微信开放平台负责人负责。知情人士表示&#xff0c;此次调整&#xff0c;将有助于微信视频号直播电商业务更好地融入…...

2024年弘连网络FIC大会竞赛题线下决赛题

总结&#xff1a; FIC决赛的时候&#xff0c;很多小问题没发现&#xff0c;在pve平台做题确实很方便。 这套题目复盘完&#xff0c;服务器这块的知识确实收获了很多&#xff0c;对pve集群平台和网络拓扑也有了一定的认识&#xff0c;感谢各位大佬悉心指导。 接下来&#xff0…...

Element-UI 入门指南:从安装到自定义主题的详细教程

Element-UI 是一个基于 Vue.js 的前端组件库&#xff0c;它提供了丰富的 UI 组件&#xff0c;可以帮助开发者快速构建高质量的用户界面。以下是使用 Element-UI 的快速入门指南&#xff1a; 安装 Element-UI Element-UI 是一个基于 Vue.js 的组件库&#xff0c;它提供了丰富的…...

vs工程添加自定义宏

一、简介 用户可以添加自定义宏变量方便工程路径名称的修改和配置 例&#xff1a;$(SolutionDir) 为解决方案路径&#xff0c;$(PojectDir) 为工程所在路径 测试环境&#xff1a;vs2017&#xff0c;qt5.14.0 二、配置 1、打开属性窗口&#xff1a;视图-》其他窗口-》属性管…...

shell脚本:将一维数组以二维数组显示

shell脚本&#xff1a;将一维数组改成二维数组显示 1.编辑脚本文件 vi output_array.sh2.编写脚本 #!/bin/bash# 假设一维数组one_array已经包含9个元素 one_array(1 2 3 4 5 6 7 8 9) # 获取数组长度 length${#one_array[]} # 数组长度除以3获得新数组行数n n$((length / …...

QT C++ 读写mySQL数据库 图片 例子

在上篇文章中描述了怎样搭建读写数据库的环境。 本文更进一步&#xff0c;描述了读写mySQL数据库&#xff0c;字符、整型数字、图片。读写图片相对难点。 数据库的图片字段用BLOB&#xff0c;如果图片较大要用longblob,否则会报错。 另外&#xff0c;读写数据库都使用了短连…...

Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数

1、进程控制几个过程 创建进程--》执行进程---》终止进程 2、进程标识 &#xff08;1&#xff09;专用进程&#xff1a;ID为0的进程是调度进程&#xff0c;常常被称为交换进程&#xff0c;也称为系统进程&#xff1b; ID为1通常是init进程&#xff0c;在自举结束时由内核调用…...

Facebook之魅:数字社交的体验

在当今数字化时代&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;承载着数十亿用户的社交需求和期待。它不仅仅是一个简单的网站或应用程序&#xff0c;更是一个将世界各地的人们连接在一起的社交网络&#xff0c;为用户提供了丰富多彩、无与伦比的数字社交体验。…...

【重装windows遇到网络适配器无法更改】

可以尝试手动在cmd中修改&#xff0c;命令&#xff1a; netsh interface ip set address name"以太网 x" static 新IP地址 子网掩码 网关 注意以太网x之间有空格&#xff0c;以太网外面的引号是英文的。 也可以先在cmd依次输入“netsh”、“interface”&#xff0…...

FFmpeg+QT播放器实战1---UI页面的设计

1、播放器整体布局的设计 该部分使用QT的UI工具&#xff0c;进行整体页面设置&#xff0c;如下图1所示&#xff1a; 2、控制布局的设计 创建ctrBar的UI页面并进行页面布局设置&#xff0c;如下图2所示&#xff1a; 将图1中ctrBarWind对象提升为ctrBar类(该界面替代原先的控…...

C/C++语法|pthread线程库的使用

笔记主要内容来自 爱编程的大柄–线程 爱编程的大柄–线程同步 在进入代码实践之前&#xff0c;我们应该搞清楚。 线程是成语的最小执行单位&#xff0c;进程是操作系统中最小的资源分配单位。 这样的话我们可以理解以下两点&#xff1a; 同一地址空间中的多个线程独有的是&…...

四川汇聚荣聚荣科技有限公司是正规的吗?

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;越来越多的科技公司如雨后春笋般涌现。然而&#xff0c;在这个信息爆炸的时代&#xff0c;如何判断一家公司是否正规成为了许多人关注的焦点。本文将围绕“四川汇聚荣聚荣科技有限公司是否正规”这一问题展开讨论&#xf…...