文字编码:

把文字转换成二进制的方法,就是给字符编号。字符的编号是固定不变的数字,再进行二进制变换成计算机可以识别的二进制数。

西文编码

一台计算机中,往往存在两种以上的编码。
计算机底层使用的是英文字符,所以,一般的,每台计算机中都存在西文编码。
根据计算机使用的地域不同,计算机中还有不同的编码形式。比如,中国的计算机有汉字编码、法国的计算机有发文编码。
西文编码最常见的是ASCII码

ASCII码:

ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)
一般的,每台计算机中都存在ASCII码,他定义了128个字符,编号是从0~127
image.png

ASCII码表查找规律

要看一个字符的编码是多少,先向上查他的高三位、再向左查他的低四位。
比如西文字母A:100 + 0001 = 1000001;转10进制:按权展开、多项求和,得到 65。
所以A的ASCII码就是65
image.png
image.png

ASCII码的位数和字节

通过查表,可以把任意西文字符转换为7位二进制数。
但是在计算机中,信息存储的基本单位是“字节”,每一个字节是8位二进制数。任何一个信息存储时,必须占用整数个字节,也就是必须占满8位。
所以,查表得到的7位二进制数需要在最高位补零。
1个字符的ASCII码,在存放的时候占用1个字节。
在字节中使用低7位,也就是从D0到D6位。最高位恒为0。
image.png

ASCII码存储规律

  • 控制字符:0-32、127
  • 数字0-9:48号开始
  • 英文A-Z:65开始
  • 英文a-z:97开始
  • 每一个字母的小写形式比大写形式大32

image.png
image.png

汉字编码:

汉字编码的过程:

  1. 汉字输入时,使用的是输入法提供的输入码,来确定输入哪个数字。
  2. 在计算机内部,汉字理论上是以国标码的形式存在,实际上是以机内码的形式存在。
  3. 汉字输出时,需要使用字库体用的字形码,来查找汉字的字形、完成输出

image.png

汉字外码(输入码):

外码也叫输入码,主要解决如何将每个汉字变成可以直接从键盘输入的代码,
目前常用的输入法主要是音码和形码两类:

  • 音码类:全拼、双拼、微软拼音、自然码和智能ABC等
  • 形码类:五笔字型法、郑码输入法等

    汉字国标码(GB2312-80)

    汉字编码标准:
    汉字国标码是1980年发布的《中华人民共和国标准信息交换编码》代号为GB2312-80,简称国标码。
    国标码对所有的常用汉字都进行编码,是依据汉字的位置进行编码的:
    image.png

    编码的过程共三步:

    第一步:构造区位码
    构造一个94行*94列的方阵
    把每一个常用汉字放到方阵中的一个固定位置
    汉字在方阵中位置不变,所以编码也就不会改变。就可以用位置来指代汉字。
    image.png
    中:行号54 、列号48;5448就是他的编码

    区位码:

    每一行称作一个“区”、每一列称作一个“位”
    这种按照行列位置来确定编码的方式叫做“区位码”

第二步:推导国标码

在区位码行号和列号上分别加32得到十进制的数,并对其进行十六进制转换。结果是一个由4位十六进制数构成的编码形式。

加32的原因:为了与ASCII码兼容,每个字节值大于32(0~32为非图形字符码值)

编码中前两位是行号、后两位是列号,这种形式就是国标码。
image.png
根据区位码计算一个汉字的国标编码。
因为2位十六进制数等价于8位二进制数。正好是一个字节。
所以每一个汉字在计算机中存储时占两个字节:

  • 高字节表示行号
  • 低字节表示列号

image.png

GJF补充说明:一个汉字占2个字节的原因

上边太绕了,我来梳理一下:
首先知道换算规则:

  • 3位二进制数 = 1位8进制数
  • 4位二进制数 = 1位16进制数
  • 8位二进制数 = 1个字节(8bit = 1bite)

然后:
一个英文字符按照ASCII码得到的是7位二进制数。由于计算机存储必须占满8位,所以最高位补零后,一个英文字符是8位二进制数。也就是一个字节。
一个汉字按照区位码转换为国标码的规则,区位码分行号和列号,行号与列号分别是十进制的两位数,算一个汉字的国标码需要找到行号与列号后,分别对行号和列号加32后得到两个十进制数。分别将这两个十进制数转换成十六进制数后得到两个2位的十六进制数,再将2个十六进制数拼接,得到一个4位的十六进制数,就是这个汉字的国标码。(见上边汉字“中”的推导图片)
根据二进制、十六进制和字节的转换规则:

  • 1位十六进制数=4位二进制数=0.5个字节
  • 2位十六进制数=8位二进制数=1个字节
  • 4位十六进制数=16位二进制数=2个字节

因此,汉字占用两个字节。

区位码和国标码的取值范围

  • 区域码的行号、列号取值范围:1-94
  • 国标码的行号、列号取值范围:33-126(需要对应+32)

这也就是为什么上边说“将行号或列号+32后再转换成十六进制数,会得到2位的十六进制数”,因为33/16 > 2。行号和列号的最小值是从33开始的,33比两个16相加都大,所以转换为十六进制后,肯定是2位及以上的。

从区位码转换成国标码需要+32的原因:

国标码+32后,得到的范围刚好和ASCII码中普通字符的范围一致,最大程度的兼容ASCII码,保证软件在不同语言环境中的通用性。

汉字机内码:

第三步:改造国标码构成机内码

取值范围重叠,为了在一段既有英文、又有中文的字符中,区分出汉字和英文,所以需要改造国标码
将国标码两个字节的最高位(D7位)都从0改为1,构成了机内码
image.png
机内码是汉字在计算机中的真正存在形式。

从国标码变成机内码可以通过运算实现

在国标码的行号、列号上分别加 80H 就可以得到机内码

区位码、国标码、机内码的关系

汉字机内码 = 汉字国标码 + 80 80H
国标码 = 区位码 + 20 20H
“中”
国标码: 5650H
机内码:D6D0H
汉字编码就是通过区位码、国标码、机内码这三步实现的。

汉字字形码:

当汉字进行输出的时候,计算机可以通过国标码来确定这是哪一个字。但是计算机并不知道这个字该怎么写、长什么样。
这时,就需要通过字库来查找一个汉字的字形码。

字形码是一个图形,输出汉字就是要输出汉字的形状,也就是图形。
汉字“大”的字形码如下:
image.png
上图一个16*16的方阵,方阵中的点有两种状态:

  • 黑表示有图案:用0编码
  • 白表示没有图案:用1编码

把一个16*16的方阵,转换成了一个256位的二进制的数。这种对图形进行编码的方式,被称作“位图”。
字形码就是一个黑白位图,只有两种颜色,对每个点编码只需1位二进制数

位图:(点阵?)

位图的基本思路是:通过逐一描述图形中每一个点来描述出整个图形
image.png

彩色图形编码

位图转换为二进制数
image.png

讨论题-编码的性质:

计算机中存储了一个二进制数,理论上它可能是数值,也可能是文字,还可能是声音、图像的一部分。应该如何确定这个二进制数的性质,从而正确使用它?

合理解析:
https://www.zhihu.com/question/360183232/answer/941828626
www.zhihu.com_question_360183232_answer_941828626.png
计算机内部依旧存储二进制数。只不过人为的设计特定的某种规定来说明哪些数据表示文字,哪些数据表示图片。然后通过这种规定去存储数据,不同性质的数据用不同的标记来记录。读取的时候,再通过这种规定解析数据,然后再根据不同的编码规则解析出真实类型的数据。

有一个很有道理的一句话:
一个事物到底代表什么,除了它本身的固有意义(如一个数字)以外,它的扩展意义完全取决于是谁来解释和表示这个事物。
所以,我们一个文件,到底是什么类型,取决于我们打开他的应用程序。比如html文件,用浏览器打开就能运行,用vscode打开就是文本。但其实,这跟二进制这里还是说的不是一件事。

其中一个解析:
https://www.zhihu.com/question/374541435
回答中提到文件头,但是下边人的反驳更点名了问题的核心:

所以怎么知道文件头的某个字节是数值还是文字?比如bmp开头那个42 4D为什么可以用ASCII码解释成BM?所以一个二进制是数值还是文字还是其它,其意义是事先规定好的。文件头里面每个字节都是什么意思,都有一个事先约定;文件头又规定了数据部分每个字节的意义,所以文件头可用看成是一种元数据。当然单纯文件头并不能完全确定数据部分意义,还要和事先的约定结合在一起才起作用


扩展资料:

图片编码

扩展资料1:图片编码.pdf

音频编码

扩展资料2:音频编码.pdf

视频编码

扩展资料3:视频编码.pdf