【转】刨根究底字符编码之一——关键术语解释(上)

声明:本系列文章参考了网上的大量资料,除了少部分资料由于未作大量修改(但基本也有少量修改,因为网上文章随意性较大,如若不改反而让人迷糊)而标明了出处之外,其余由于已作了大量改写,因此没有再一一说明,在此对原作者表示歉意并感谢。另外,文中图片部分来自网络,部分为本人制作,也不再一一说明。同时,文中若有错漏,还请直接招呼板砖,不用客气。

关键术语解释(上)

一、位

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位来代表一个字节(最终形成这一事实标准除了历史原因和商业原因之外,最重要的原因应该是由于二进制的特性:2的次方计算更方便快捷)。

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

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

 

三、字与字长

1.

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

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

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

2.

计算机处理数据的速率,显然和它一次能加工的位数以及进行运算的快慢有关。如果一台计算机的字长是另一台计算机的两倍,若两台计算机的速度相同,在相同的时间内,前者能做的工作一般是后者的两倍。因此,字长与计算机的功能和用途有很大的关系,是计算机的一个重要技术指标。

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

 

四、编码

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

 

五、解码

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

六、字符集

1.

字符集(Character Set、Charset),字面上的理解就是字符的集合,是一个自然语言文字系统支持的所有字符的集合。字符是各种文字和符号的总称,包括文字、数字、字母、音节、标点符号、图形符号等。

例如ASCII字符集,定义了128个字符;GB2312字符集定义了7445个字符。而字符集准确地来说,指的是已编号的字符的有序集合(但不一定是连续的,后文有详细介绍)。

2.

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

 

注:图中所示微软在GB2312的基础上扩展制订了GBK(Guo-Biao Kuozhan),然后GBK才成为“国家标准”(也有说GBK不是国家标准,只是“技术规范指导性文件”);但网上也有资料说是先有GBK(由全国信息技术标准化技术委员会1995年12月1日制订),然后微软才在其内部所用的CP936代码页中以GBK为基础进行了扩展,亦即Windows系统中的CP936代码页实际上是GBK编码方案的一个实现(本人更倾向于这后一种说法)。

七、字符编码

1.

字符编码(Character Encoding),是把字符集中的字符按一定方式编码为某指定集合中的某一对象的过程(比如将字符编码为由0和1两个数字所组成的位串模式、由0~9十个数字所组成的自然数序列或电脉冲等),亦即在字符集与指定集合两者之间建立一个对应关系(即映射关系)的过程。这是信息处理的一项基础技术。

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

2.

电子元件的不同状态(一般为断开和闭合两种状态)的组合能代表数字系统中的数字(比如断开和闭合代表二进制中的0和1),因此字符编码的过程也就可以理解为将字符转换映射为计算机可以接受的二进制数字的过程,这样才便于字符在计算机中表示、存储、处理和传输(包括在网络中传输)。

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

八、字符编码模型

1.

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

2.

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

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

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

3.

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

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

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

4.

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

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

更进一步而言,在传统字符编码模型中,字符编码方式与字符集是紧密结合在一起的;而在现代字符编码模型中,字符编码方式与字符集脱钩了。用软件工程的专业术语来说,就是将之前紧密耦合在一起的字符编码方式与字符集解耦了。

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

5.

Unicode Technical Report (UTR统一码技术报告) #17《UNICODE CHARACTER ENCODING MODEL》中,现代字符编码模型分为了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):将字节序列作进一步的适应性编码处理

后面将分层予以简要介绍。

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

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

相关文章

angular8多选框实现点击整行任意位置<tr>就可以选中多选框

代码&#xff1a; <tr *ngFor"let d of EnergyUseInfos" (click)"selectEnergyUses(d)"><td style"text-align: left"><input type"checkbox" style"margin: auto" name"{{d}}" [(ngModel)]"…

【转】刨根究底字符编码之零——前言

前言 一、 字符编码是计算机世界里最基础、最重要的一个主题之一。不过&#xff0c;在计算机教材中却往往浮光掠影般地草草带过&#xff0c;甚至连一本专门进行深入介绍的著作都找不到&#xff08;对这一点我一直很困惑&#xff0c;为什么就没有哪位大牛对这个如此基础、重要…

JAVA使用ByteArrayOutputStream、ByteArrayInputStream将对象序列化反序列化,通过JAVA socket实现对象在网络中传输

1.序列化和反序列化&#xff1a; 序列化是对象(类的实例)转换成字节数组或者字符串通过网络传输或者存储到本地文件。反序列化&#xff1a;就是将字节数组或字符串在转换成对象实例的过程。&#xff08;因为在网络中传输或者写本地文件&#xff0c;是不能使用对象的&#xff0…

【转】刨根究底字符编码之二——关键术语解释(下)

关键术语解释(下) 如前所述&#xff0c;现代字符编码模型共分为5层&#xff0c;下面分层进行简要介绍。 一、第1层 抽象字符表ACR (Abstract Character Repertoire抽象字符清单)&#xff1a;明确字符的范围(即确定支持哪些字符) 1. 抽象字符表ACR是一个编码系统支持的所有抽…

正则表达式来判断Sql语句中Select到from之间使用了*而不是字段名

正则&#xff1a;这里大小写转换用的java的toLowerCase()方法&#xff0c;或者自己改一改正则也可以。 \bselect\b((?!\bfrom\b).)*?\*.*?\bfrom\b主要就是用来判断select到from之间是不是用了*而不是使用字段名来进行查询&#xff0c;以此来规范Sql语句&#xff01; publ…

【转】刨根究底字符编码之三——字符编码的由来

字符编码的由来 一、为什么需要对字符进行编码 1. 计算机一开始发明出来时是用来解决数字计算问题的&#xff0c;后来人们发现&#xff0c;计算机还可以做更多的事&#xff0c;例如文本处理。 但计算机其实挺“笨”的&#xff0c;它只“认识”010110111000…这样由0和1两个数…

SpringMVC配置没问题却却找不到页面,页面显示404

在Artifacts下此工程下新建一个lib文件夹&#xff0c;存放jar包&#xff0c;因为idea新建modules的时候不是直接创建的web项目&#xff1a; 选中lib点加号把jar导入进去&#xff0c;然后重启tomcat

【转】刨根究底字符编码之四——EASCII及ISO 8859字符编码方案

1. 计算机出现之后&#xff0c;首先逐渐从美国发展到了欧洲。由于欧洲很多国家所用到的字符中&#xff0c;除了基本的、美国也用的那128个ASCII字符之外&#xff0c;还有很多衍生的拉丁字母等字符。比如&#xff0c;在法语中&#xff0c;字母上方有注音符号&#xff1b;而欧洲…

tomcat乱码问题解决

tomcat安装目录下conf文件夹下的logging.properties文件&#xff0c;将java.util.logging.ConsoleHandler.encoding编码为GBK&#xff0c;如图&#xff1a;

【转】HMAC哈希消息认证码及算法原理

HMAC算法原理 HMAC算法是一种基于密钥的报文完整性的验证方法 &#xff0c;其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算&#xff0c;形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。 HMAC算法可以用来…

RestFul风格学习

传统的url是这样的 RestFul是这样的

【转】c#快捷键

CTRL SHIFT B生成解决方案 CTRL F7 生成编译 CTRL O 打开文件 CTRL SHIFT O打开项目 CTRL SHIFT C显示类视图窗口 F4 显示属性窗口 SHIFT F4显示项目属性窗口 CTRL SHIFT E显示资源视图 F12 转到定义 CTRL F12转到声明 CTRL ALT J对象浏览 CTRL ALT …

Angular使用Console.log()打印出来的数据没问题,点击详情后数据变了

我在一个界面添加数据使用updataEvent将对象返回给另一个界面后&#xff0c;在onUpData中处理时使用 this.xxxxx d&#xff0c;直接将地址值给了变量&#xff0c;当这个方法结束后d被重置了&#xff0c;所以this.xxx的值也消失了,这里要使用下面的方法复制一个对象出来。 this…

【转】刨根究底CSS(1):开篇

01 一道小菜 CSS很难&#xff0c;这应该是绝大多数Web开发人员的共识。 什么&#xff1f;你并不觉得很难&#xff1f;那我就先上一道小菜&#xff0c;请君品尝。 这是个乍一看&#xff0c;让人觉得很诡异的案例…… 算了&#xff0c;本来想滔滔不绝介绍一番&#xff0c;但一…

angular8 设置延时时间

延时执行this.setHiden()方法 setTimeout(() > {this.setHiden();},300);

【转】刨根究底CSS(2):CSS中的各种值——初始值,就是默认值吗?

先问个非常简单的问题&#xff0c;这个问题的答案&#xff0c;相信大部分Web开发人员都自认为显而易见&#xff0c;但却又多半会答错&#xff1a;CSS属性中的初始值(initial value)&#xff0c;就是默认值(default value)吗&#xff1f; 难道不对吗&#xff1f;请往下看。 默…

sqlIte 多条件排序失效问题

写倒叙排序就直接按照mysql那样两个字段后面加一个desc&#xff0c;然后一直没有效果&#xff0c;改为如下&#xff1a; order by starttime desc,endtime desc;每个条件后都加desc就可以了&#xff0c;mysql应该是同样适用的&#xff0c;因为多个不同字段可以按照不同的排序方…

【转】刨根究底正则表达式(1):开篇

奇葩的正则表达式 1、常规学习过程很痛苦 计算机领域中有一些非常基础、重要以及应用广泛&#xff0c;但却又特别容易让人困惑、非常难以理解的主题&#xff0c;这包括了字符编码、字节序(即大小端表示)、浮点数实现、日期时间处理以及正则表达式等。 正则表达式目前市面上并…

正则表达式:匹配非0的整数和小数Double

要求可以是整数、小数&#xff0c;但是不能为0 下面正则0.0之类的也是匹配不中的 (后来测试发现出一个bug&#xff0c;竟然可以匹配到1 1&#xff0c;中间加个空格可以匹配中) ^(([1-9][0-9]*.{1}[0-9])|([0].{1}[1-9][0-9]*)|([1-9][0-9]*)|([0][.][0-9][1-9]))$所以又改了一…

【转】刨根究底正则表达式(2):文本查找方式的演化历史

上一篇文章讲到&#xff0c;从根源上来讲&#xff0c;正则表达式是为了解决文本的查找问题(也称为匹配问题)而诞生的。不过&#xff0c;文本查找方式的历史&#xff0c;要远早于正则表达式。 那么&#xff0c;在正则表达式出现之前&#xff0c;文本查找方式经历了什么演化过程…