【转】刨根究底字符编码【2.0版】(2):关键术语解释

上一篇中讲道,字符编码所涉及的面非常广,向下的话,涉及到计算机的底层技术,甚至是硬件实现。

因此,这里就让我们从字符编码涉及到的最基本的术语讲起。大部分术语你可能都已经有了解了,但我们现在从字符编码的角度,再来看这些术语,或许你会有不同的理解。

1.

位,即比特(Bit),亦称二进制位、比特位、位元,指二进制数中的一位,是计算机中信息表示的最小单位。

Bit是Binary digit(二进制数位)的缩写,由数学家John Wilder Tukey提出,习惯上以小写字母b表示,如8比特可表示为8b。

2.

每个比特有0和1两个可能的值,除了代表数值本身之外,还可代表:

  • 数值的正、负;
  • 两种状态,如电灯的开、关,某根导线上电流的有、无,等等;
  • 抽象逻辑上的是、否,或者说真、假。

字节

1.

在计算机中,通常都会使用一连串的位(即比特),称之为位串(即比特串,bit string)。

很显然,计算机系统都不会让你使用任意长度的位串,而是使用某个特定长度的位串。

一些常见的位串长度形式具有约定好的名称,如,半字节(nibble)代表四个位的组合,字节(byte)代表8个位的组合;还有字(word)、双字(Double word,简写为Dword)、四字(Quad word,简写为Qword)、十字节(Ten byte,简写为Tbyte)等等。

2.

字节(byte),又称为位元组,音译为“拜特”(但很少使用这个译名),是计算机中计量存储容量和传输容量的一种基本计量单位,是由连续的、固定数量的位(即比特)所组成的位串(即比特串)。

字节一般由8个位组成,即1 byte = 8 bit。习惯上用大写的B表示,如3字节可表示为3B。

现代个人计算机(PC)的存储器编址,一般是以字节为单位的,称之为按字节编址,因此字节一般也是存储器的最小存取单位以及处理器的最小寻址单位(也有按位寻址、按字寻址等等,但在个人计算机上应用不普遍,这里不讨论)。

3.

字节作为存储器的最小存取单位以及处理器的最小寻址单位这一重要特点,跟字符编码的关系极为密切,比如,码元的单字节与多字节、字节序的大端序与小端序等,都与以字节为基础的基本数据类型密切相关(详见后文介绍)。

4.

习惯上,按照下面的图来排列一个字节上的各个位的顺序,即按照从右到左的顺序,依次为最低位(第0位)到最高位(第7位):

5.

注意,字节不一定非得是8位,以前也有过4位、6位、7位、12位或18位作为一个字节的标准,比如IBM 701(36位字长,18位为一字节)、IBM 702(7位字长,7位为一字节)、CDC 6600(60位字长,12位为一字节byte)等。只是现代计算机的事实标准就是用8位来代表一个字节。

最终之所以形成以8位为一个字节这一事实标准,除了历史原因和商业原因之外,最重要的原因应该是由于二进制的特性——2的次方计算更方便快捷。

正是因为这个原因,在很多较为严谨的技术规格文献中,为了避免产生歧义,更倾向于使用8位组(Octet)而不是字节(Byte)这个术语来强调8比特串。

不过,由于大众基本上都将字节理解为8比特的8位组,因此一般文章中如果未作特别说明,基本上都将8位组直接称之为字节,或者说,字节一般默认指的是8位组。

字与字长

1.

虽然字节是大多数现代计算机的最小存储单位和传输单位,但并不代表它是计算机可以最高效地处理的数据单位。

一般来说,计算机可以最高效地处理的数据大小,应该与其字的字长相同,这就涉及到了字及字长的概念。

  • 字: 在计算机中,一串比特位(即位串、比特串)是作为一个整体来处理或运算的,这串比特位称为一个计算机字,简称字。字通常分为若干个字节。
  • 字长: 即字的长度,是指计算机的每个字所包含的位数。字长决定了CPU一次操作所处理的实际比特位数量的多少。字长由CPU对外数据通路的数据总线宽度决定。

2.

计算机处理数据的速率,显然和它一次能加工的位数以及进行运算的快慢有关。如果一台计算机的字长是另一台计算机的两倍,若两台计算机的速度相同,在相同的时间内,前者能做的工作一般是后者的两倍。

因此,字长与计算机的功能和用途有很大的关系,是计算机的一个重要技术指标。

在目前来讲,桌面平台的处理器字长正处于从32位向64位过渡的时期,嵌入式设备基本稳定在32位,而在某些专业领域(如高端显卡),处理器字长早已经达到了64位乃至更多的128位。

编码与解码

编码(Encode),是信息从一种形式转换为另一种形式的过程,比如用预先规定的方法将字符(文字、数字、符号等)、图像、声音或其它对象,转换成规定的电脉冲信号或二进制数字的过程,就属于编码。

解码(Decode),为编码的逆过程。

字符与字符集

1.

字符(Character),是各种文字和符号的总称,包括文字、数字、字母、音节、标点符号、图形符号等。

字符集(Character Set、Charset),字面上的理解就是字符的集合,是一个自然语言文字系统支持的所有字符的集合。

字符集准确地来说,指的是已编号的字符的有序集合(但不一定是连续的,后文有详细介绍)。

2.

常见字符集有ASCII字符集、ISO 8859系列字符集(ISO 8859-1~8859-16)、GB系列字符集(GB2312、GBK、GB18030)、BIG5字符集、Unicode字符集等。

字符编码

1.

字符编码(Character Encoding),是把字符集中的字符按一定方式编码为某指定集合中的某一对象的过程。比如将字符编码为由0和1两个数字所组成的位串模式、由0~9十个数字所组成的自然数序列或电脉冲等。

也就是说,在字符集与指定集合两者之间建立一个对应关系(即映射关系)的过程。这是信息处理的一项基础技术。

因此,通常以字符集来定义字符,以计算机为基础的信息处理系统则利用电子元件(即硬件)的不同状态的组合来表示、存储和处理字符。

2.

电子元件的不同状态,可以用来代表数字系统中的数字,比如电子元件一般具有电路的断开和闭合两种状态,其中电路断开代表二进制中的0,电路闭合代表二进制中的1。

因此,字符编码的过程,也就可以理解为,将字符转换映射为计算机可以接受的二进制数字的过程,这样才便于字符在计算机中表示、存储、处理和传输(包括在网络中传输)。

常见的例子是将常用的拉丁字母表编码成摩斯电码和ASCII码。

其中,ASCII码将字母、数字和其它符号进行编号,并且在计算机中直接用7比特的二进制数字来表示这个编号。通常会额外地在最高位(即首位)再增加一个扩充的比特位“0”,以便于计算机系统刚好以1个字节(8比特位)的方式来进行处理、存储和传输。

字符编码模型

1.

字符编码模型CEM(Character Encoding Model),是反映字符编码系统的结构特点和各构成部分相互关系的模型框架。

2.

由于历史的原因,早期一般认为字符集和字符编码是同义词,并不需要进行严格区分。因此在像ASCII这样的简单字符集为代表的传统字符编码模型中,这两个概念的含义几乎是等同的。

因为,在传统字符编码模型中,基本上都是将字符集里的字符进行编号(字符编号转化为二进制数后一般不超过一个字节),然后该字符编号就是字符的编码。

但是,由统一码(Unicode)和通用字符集(UCS)为代表的现代字符编码模型,并没有直接采用ASCII这样的简单字符集的编码思路,而是采用了一个全新的编码思路。

3.

这个全新的编码思路,将字符集与字符编码的概念更为细致地分解为了以下几个方面:

  • 字符集中包含了哪些字符;
  • 这些字符的数学编号是什么;
  • 这些数学编号如何编码成一系列逻辑层面有限大小的二进制数字,即码元序列;
  • 这些逻辑层面的码元序列如何转换映射为物理层面的字节流,即字节序列;
  • 在某些特殊的传输环境中(比如Email中),再进一步将字节序列进行适应性编码处理。

这几个方面作为一个整体,于是构成了现代字符编码模型。

4.

现代字符编码模型之所以要分解为这么几个方面,其核心思想是创建一个能够用不同方式来编码的通用字符集。

注意这里的关键词:“不同方式”与“通用”。

这意味着,同一个字符集,可以通用于不同的编码方式;也就是说,可以采用不同的编码方式来对同一个字符集进行编码。字符集与编码方式之间的关系可以是一对多的关系。

更进一步而言,在传统字符编码模型中,字符编码方式与字符集是紧密结合在一起的;而在现代字符编码模型中,字符编码方式与字符集脱钩了。

用软件工程的专业术语来说,就是将之前紧密耦合在一起的字符编码方式与字符集解耦了。

因此,为了正确地表示这个现代字符编码模型,需要采用更多比“字符集”和“字符编码”更为精确的概念术语来描述。

5.

在Unicode Technical Report #17 (UTR统一码技术报告第17号)《UNICODE CHARACTER ENCODING MODEL[1]》中,现代字符编码模型分为了5个层次,并引入了更多的概念术语来描述(下面所涉及到的一些全新的概念术语,这里只做简介,更详细的解释见后文):

  • 第1层 抽象字符表ACR(Abstract Character Repertoire):明确字符的范围(即确定支持哪些字符)
  • 第2层 编号字符集CCS(Coded Character Set):用数字编号表示字符(即用数字给抽象字符表ACR中的字符进行编号)
  • 第3层 字符编码方式CEF(Character Encoding Form):将字符编号编码为逻辑上的码元序列(即逻辑字符编码)
  • 第4层 字符编码模式CES(Character Encoding Scheme):将逻辑上的码元序列映射为物理上的字节序列(即物理字符编码)
  • 第5层 传输编码语法TES(Transfer Encoding Syntax):将字节序列作进一步的适应性编码处理

好,关键术语就简要介绍到这里。

参考资料

[1]

UNICODE CHARACTER ENCODING MODEL: http://www.unicode.org/reports/tr17/

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

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

相关文章

Cause: java.sql.SQLSyntaxErrorException: Table ‘Chun.user‘ doesn‘t exist Springboot+MybatisPlus报错

排错:yml配置没问题,可以连接到数据库,导包没问题,数据库里面也有这个库和表, 最终发现是因为表名大小写的问题,因为我直接连接的阿里云服务器上的mysql,而mysql在linux下表名是区分大小写的导…

浏览器字体大小设置_CSS之 浏览器解析样式的过程

阅读本文约需要10分钟大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务!1、长期为你提供最优质的学习资源!2、给你解决技术问题!3、每天在朋友圈里分享优质的技…

angular实现国密算法sm2、sm3和sm4的ts版,基于sm-crypto库实现,前后端实现

ts版,js的话直接根据npm文档调用就可以了! ts提供的方法有问题,所以还换了个思路来实现!而且因为不是nodeJs环境所以const sm4 require(sm-crypto).sm4这个在ts里是报错的导致无法实现,如果是使用的是electron那么使…

【转】.net异步性能测试(包括ASP.NET MVC WebAPI异步方法)

很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.Net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语…

win7关机快捷键_电脑快捷键大全(上)

Windows快捷键1单独按Windows:显示或隐藏“开始”功能表WindowsBREAK:显示“系统属性“对话框WindowsD显示桌面或回复桌面Windows M最小化所有窗口WindowsShiftM:还原最小化的窗口CrtlShiftN:新建文件夹WindowsE:打开“我的电脑”…

【转】ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET

以下为教程: 在现有webapi项目中,nuget安装以下两个插件 swagger.net.ui swashbuckle 安装完毕后可以卸载Swagger.NET,此处不需要! 安装完毕后屏蔽以下代码 直接运行调试 在浏览器的目录后面加上/swagger即可跳转到swagger调试页 此时如果没有注释. 项目属性里添加xml注释…

idea提示“ cannot access xxxxxxxx.class“的解决方法,idea的bug

同一个包下的public类使用报错,应该是idea的bug: file -> Invalidate Caches / Restart

电脑屏保在哪里设置_手机屏保调成绿色能护眼?真的吗?

说到护眼,你首先想到的是什么颜色?估计90%的人都会不自觉的想到绿色!因为从小家长和老师都会跟我们说:眼睛累了就多看窗户外的绿色植物。久而久之,一说到护眼,大家脑海里第一个想到的就是绿色。你会看到不少…

电脑休眠和睡眠的区别_关机、睡眠、休眠的区别

都知道电脑有关机、睡眠、休眠三种休息模式,但是后两个选项使用的人非常少,大多数人每次用完电脑都会选择立即「关机」。有人是为了让电脑「休息」,有人是为了低碳精神,还有人是因为下班不关电脑要罚款,不管是什么原因…

SpringCloud:学习Docker安装zookeeper,注册服务

1.没镜像就拉取镜像 dockerhub中查看版本 官网 docker pull zookeeper:3.4.14 不加版本号也行,默认拉取最新版 创建并启动容器 docker run -p 2181:2181 --privilegedtrue --name zookeeper01 -d zookeeper –privilegedtrue 容器内用户开启root权限 docker ps…

win10固态硬盘分区 整数_惠普HP笔记本Win10改Win7系统教程

惠普HP笔记本和台式机目前都预装的Win10系统,当然Win7旗舰版才是很多用户喜欢的,不过换装Win7有很多方面比较麻烦,如BIOS设置、U盘启动及方分方面都是很多用户不熟悉的,这里小编就详细分享下惠普笔记本Win10改Win7系统教程(BIOS设…

SpringCloud:学习 Docker安装Consul,注册服务

1.拉取镜像 docker pull consul 2.启动容器 docker run -d -p 8500:8500 --restartalways --nameconsul consul:latest agent -server -bootstrap -ui -node1 -client0.0.0.0 创建容器时没有添加参数 --restartalways ,导致的后果是:当 Docker 重启时…

【转】WebApi 身份认证解决方案:Basic基础认证

参考路径:https://www.cnblogs.com/landeanfen/p/5287064.html 前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题。也就是说,任何人只要知道了接口的url,都能够模拟http请求去…

LeetCode每日打卡 - 汉明距离

位异或运算(^) 运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。 比如:8^11. 8转为二进制是1000,11转为二进制是1011.从高位开始比较得到的是&#xff…

【转】Task和async/await详解

一、什么是异步 同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者…

LeetCode每日打卡 - 反转每对括号间的子串

题解中有个更好的思路&#xff0c;stack存入的不是(的坐标&#xff0c;存入每次到左括号的字符串&#xff0c;拿到右括号就对其进行反转&#xff0c;更妙一些。 import java.util.Stack; class Solution {public String reverseParentheses(String s) {Stack<Integer> s…

iar stm32_树莓派玩转STM32开发(一)——介绍篇

01—树莓派树莓派(Raspberry Pi)听起来让人流口水&#xff0c;但它的确不是吃的(身为非吃货的我第一次也以为它是食物……)。树莓派是基于ARM架构的Linux卡片电脑&#xff0c;由英国树莓派基金会开发&#xff0c;目的是以低价硬件以及自由软件来促进学校的基本电脑科学教育。树…

JavaScript面向对象的理解

前言 1. 本文默认阅读者已有面向对象的开发思想&#xff0c;最好是使用过c、java&#xff0c;本人Java不太熟悉&#xff0c;所以例子都是用C来写的。 2. 本人不是专业网站开发人员&#xff0c;接触javascript一年多&#xff0c;自己也编写调试了一些代码&#xff0c;本文完全根…

【转】C# 彻底搞懂async/await

关键&#xff1a; 异步方法&#xff1a;在执行完成前立即返回调用方法&#xff0c;在调用方法继续执行的过程中完成任务。 async/await 结构可分成三部分&#xff1a; &#xff08;1&#xff09;调用方法&#xff1a;该方法调用异步方法&#xff0c;然后在异步方法执行其任务的…

LeetCode每日打卡 - 汉明距离总和

有点慢&#xff0c;两层循环也可以完成&#xff0c;就是换个方向&#xff0c;外层遍历32大小的bits数组&#xff0c;里层遍历nums的数字每次右移一位&#xff0c;计算方法类似。 class Solution {public int totalHammingDistance(int[] nums) {//int 是4byte &#xff0c; 每…