2.1.4 字符与字符串编码

2.1.4 字符与字符串编码2.1.4 字符与字符串编码2.1.4 字符与字符串编码2.1.4 字符与字符串编码2.1.4 字符与字符串编码2.1.4 字符与字符串编码

XYXZNB hhh~
(҂◔∀◐҂)☆万圣节快乐♬☆◥(ฅº₩ºฅ)◤ 不给糖就捣蛋 ☆

好的,在之前的小节中我们学习了数字应该怎么在计算机内进行表示这一小节,我们来看字符和字符串应该怎么在计算机里面表示,首先我们会介绍英文字符,怎么在计算机里面表示接下来是中文字符之后会谈一谈字符串应该怎么存储好,那首先来看英文字符,但凡有过编程经验的同学肯定都知道这个东西ask嘛英文在计算机里就是用ask码来表示的,我们看一下我们平时使用的这些键盘,有一些ABCD这样的字母,还有012345这样的一些数字,当然还有一些,我们在屏幕上没办法打印出来的,用于控制计算机的一些按键一些字符,比如说上下啊delete删除之类的一些字符,那由于计算机硬件只能识别0101这样的二进制数所以我们必须制定一个规则把这些字符把。那由于计算机硬件只能识别0101这样的二进制数,所以我们必须制定一个规则,把这些字符把它映射为0101的二进制数那常用的英文字符还要控制字符,这些总共只有128个,所以我们只需要7个二进制位进行编码就可以,因为2的7次方应该是等于128,所以7个二进制位足够表示128个字符能够进行011映射,只不过由于计算机处理数据的时候,通常都是以一个字节为单位,也就是8个比特为单位,所以虽然理论上我们只需要7位就可以表示128个字符,但是实际存到计算机里的时候,通常会在高位补一个0,也就是凑足一个自己,那这张表,给大家罗列了128个asc编码的字符。22126位进行编码就可以,因为2的7次方应该是等于128,所以7个二进制位足够表示128个字符能够进行一一映射,只不过由于计算机处理数据的时候,通常都是以一个字节为单位,也就是8个比特为单位,所以虽然理论上我们只需要7位就可以表示128个字符,但是实际存到计算机里的时候,通常会在高位补一个0,也就是凑足一个资金,那这张表给大家罗列了128个ask编码的。排列是有一定规律的,首先来看一下32126这个区间内的这些字符,比如53号字符对应的是阿拉伯数字5,还有68号对应的是大写的第1个英文字符R32号对应的 SPC指的是space就是空格这个字符,而总之32126这些字符都是我们平时可以在计算机屏幕上看到的,可以打印出来的字符,所以称为可印刷字符,而其余的这些字符就是用于控制和通信的,来解释一下什么叫控制和通信,比如127号字符,这个其实是delete的一个,呃缩写那顾名思义,当我们在键盘上按下delete这个按键之后计算机就会执行相应的比如删除字符是用于控制计算机信息。的一个缩写,那顾名思义,当我们在键盘上按下delete这个按键之后,计算机就会执行相应的,比如删除字符之类的工作,因此这样的字符是用于控制计算机来执行某一种行为的,所以这一类的字幅叫做控制字符,然后再举一个通信字符的呃一个例子,比如6号字符ACK,学过计算机网络的同学应该对ACK这个缩写啊并不陌生,当两台计算机进行网络通信的时候,其中一台计算机收到另一台计算机发来的报文,那么需要给他回复一个ACK这样的一个信号,所以ACK这个字符就是一个很典型的用于实现计算机之间通信的字符总之临到三十一还有一百二十七这几个字符都是用于控制或者用于通信到我们。那需要给他回复一个ACK这样的一个信号,所以ACK这个字符就是一个很典型的用于实现计算机之间通信的字符,好总之031还有127,这几个字符都是用于控制或者用于通信的,接下来我们再把目光放到可印刷字符这个部分来看一下有什么规律,4857这个区间内,刚好是我们阿拉伯数字09这个范围,那4849 50这些只是10进制的表示形式,如果把它翻译成二进制的话,48应该是0011 0000一直到57应该是00111001,也就是说所有这些数字字符的前4个比比特币都是一样的,而后4个比特币你会发现他刚好对应了这些字符的bcd吗或者更确切的说应该你会发现他刚好对应了这些字符的bcd吗或者更确切的说应该是。0110000一直到57应该是00111001,也就是说所有这些数字字符的前4个比例分为都是一样的,而后4个比特位你会发现他刚好对应了这些字符的BCD嘛,或者更确切的说应该是8421嘛,就这个字符的后4个比特位是1001,那么如果用8421码的规则来解释的话,不刚好就是9吗?好,那这是这些数字字符的规律,另外我们再来看英文字母大写字母的区间是这样的一个范围,6590,然后小写字母是97122啊,这些都不用记,但是我们需要知道所有的这些大写字母,还有所有的这些小写的字母这些相邻的字母他们的吗也是相邻的另外一点点所有的大写字母。按英文字母大写字母的区间是这样的一个范围,6590然,后小写字母是97122啊,这些都不用记,但是我们需要知道所有的这些大写字母,还有所有的这些小写的字母,这些相邻的字母,他们的ask码也是相邻的,另外一点大家会发现所有的大写字母的啊,前三个比特都是010,而后面的5个比特如果把它转换成10进制的话,刚好是一一直到11010,这个是26,所以总共有26个英文字母,那么这26个英文字母的后5个比特位的编号刚好就分别对应126,好那小写字母也是一样的,前边的三个比特位都是011,而后边的5个比特位分别就是126这样的一个范围这个规律可以。看下这个规律可以怎么来出题已知字母大写的a它的ask码值是65,那么字符存放在存储单元M当中问存储单元MG,显然这里边存放的就是H这个字母所对应的asthma,所以这个题其实是要用a的ask码推出H的S码,a是第1个字母,而H大家可以数一下是第8个字母,所以H的码值应该是在a的基础上再加7,于是等于72,那我们再把这个十进制翻译成二进制,就应该是1001000,那由于每个字母的ask码都是8个比特位,所以我们需要补一个零凑足8位好,那这就得出了这道题的答案我们刚才提到的另一个规律所有的这些大写字母前三位都是一样的只有我们刚才提到的另一个规律所有的这些大写字母前三位都是一样的只有后卫。这道题的答案那还有一个思路,可以利用我们刚才提到的另一个规律,所有的这些大写字母它的前三位都是一样的,只有后5位不一样,那么a是第1个字母,所以它的后5位二进制刚好就是一,而H是第8个字母,所以H的后5个二进制位翻译成十进制,刚好应该对应R,所以H对应的ask嘛,我们只需要把后面的5个二进制位表示为8就可以了啊,好,那这是第2个做法,好,那接下来给大家一个例题,大家可以暂停来练练手,暂停一下。啊,就不再赘述,所有的大写字母的ask码值都是连续的,所有的小写字母的阿斯玛值也是连续的,只要抓住这个规律就很简单了,好那到目前为止我们已经知道了英文应该怎么在计算机里面进行表示,由于英文里面只有26个字母,算上大小写,再算上标点符号,各种控制符号,128个字符就足够英文世界的使用了,所以在计算机里表示英文只需要8个比特的信息就足够,甚至用7个比特就可以,但是对于中文来说我们的汉字很多很多,常用的汉字就3500多个,再加上各种各样的生僻字,所以汉字里边有可能出现的字符是几万个好像是由于要表示几万个汉子的字符八个比特的信息是不够的因为八个比特的二进制。对应256个字符好,所以为了解决汉字在计算机内部的表示,对,在1980年1980年我们国家推出了一个汉字编码的标准啊,叫做GB2312,在80年版的这个汉字编码当中,我们的汉字再加各种各样的什么标点符号之类的东西,总共只有7000多个,也就是并没有全部囊括呃几万个汉字,但是因为是在1980年嘛,所以7000多个常用的汉字也足够用了,好,那来看一下这个汉字的编码是怎么设计的,首先这么多的汉字总共被分为了94个区,每个区有94个位置,直观一点来讲,其实就是定义了一个94行94列的格子,然后每一个格子会对应一个汉字,比如说汉可能是在这个格子那自是在这个字所以那自是在这个字所以九。给每个区的90直观一点来讲,其实就是定义了一个94行94列的格子,然后每一个格子会对应一个汉字,比如说汉可能是在这个格子啊字可能是在这个格子,所以给这94个区分别进行编号,再给每个区的94个位置分别进行编号,我们就可以用区号和位置号或者说横坐标和纵坐标来对应某一个汉字了,那汉这个字它就是在第1个区,然后第2个位置而字就是在第3个区第1个位置,那每一个汉字所对应的区号,还有位置好,就是这个汉字的区位码,那用这种区位码映射到汉字,其实是很直观的,很符合我们人类的理解这个字他的驱马是十六位码是零一但这个事实那把十六和零。因为16进制26, 所以说。区位码映射到汉字其实是很直观的,很符合我们人类的理解,比如啊这个字它的取码是16啊,喂马是01,当然这个是10进制的表示方式,那把16和01转换成它们所对应的16进制,因为16进制和二进制其实可以很方便地进行转换好,我们回头看一下之前提到的阿斯玛,看一下区位码的这种编码方式有可能造成什么问题,现在假设a这台计算机给B这台计算机发送一系列的中文字符,那么如果用区位码的这种编码方式a给B发送的话,那由于区码和位码都是093这个范围,所以a给B发送的第1个字节的信息有可能刚好就是6,那当B收到的第1个字节是6的时候,B这个计算机是不是有可能会以为这是a给他发送了一个ACK一个却认出来ack这个通行证。通信或者控制字符的时候也有可能出现其他的一些错误,所以如果趣位码的第1个字节和第2个字节都处于093这个范围,那么有可能在进行数据传输网络通信的时候,会出现一些意想不到的错误,那怎么来解决这个问题呢?其实很简单,我们用于控制和通信的字符不是0~31这个范围嘛,那如果我们把区位码的第1个字节和第2个字节都分别加上32,也就是加上20H这个是32的16进制表示都分别加上20H的话,那么是不是就意味着曲马和魏马都会从32开始啊?区位码都大于32,那么在进行通信的时候,就不可能会出现刚才所说的这种呃异常的情况,好,因此回到刚才这个地方,我们之前是定义了区位码然后我们需要在区位码的基础上第一个字节加上二然后我们需要在区位码的基础上第一个字节加上二零。说的这种呃异常的情况好,因此回到刚才这个地方,我们之前是定义了区位码,然后我们需要在区位码的基础上,第1个字节和第2个字节分别加上20H进行了这样的处理之后就得到了所谓的国标嘛,也就是GB2312所规定的这个编码,那国标码的这种编码方式就可以满足数据的传输,这个需求了,但是如果要把汉字存到计算机里边,那还需要在国标码的基础上再分别加上80 80H从而得到汉字内码全称是汉字机内码后来解释一下为什么会有这种奇怪的规定,还是要回到我们之前的ask码表,区位码的取码和位码分别是093这样的,呃,一个范围在我们加上2020H之后得到了国标码那两那两个字。28对吗?全称是汉字机内码,后来解释一下为什么会有这种奇怪的规定,还是要回到我们之前的ask码表,区位码的区码和位码分别是093这样的,呃,一个范围在我们加上2020H之后得到了国标码,那国标码的两个字节就有可能是32啊,到32+93=125,有可能会落在这样的一个范围,那32~125刚好又是这些英文字符的一个表示范围,所以如果我们想让我们的中文编码和ask码能够兼容不会相互冲突的话我们就必须避开这个区间那怎么避免这个吧我们只需要在上第一个自己和第二个字节都通通加上。啊和英文的编码就不会再发生冲突,一个汉字占两个字节,但是汉字的任何一个字节肯定都是大于128的,所以如果计算机读出一个字节的数据,发现这个字节是落在了小于128的范围,那么就说明这个字节就是对应了某一个英文字符,而如果这个字节它的范围刚好是在120 18之外的,那么计算机就可以知道,除了这个字节之外,我们还需要读出下一个字节,然后把这两个字节组合起来,把它对应上一个汉字好,所以回到刚才这个PPT,在国标码的基础上加上8080H设备了,汉字编码和ask码能够相互兼容,因为8点H其实对应的就是这样的一个二进制数,最高位是一而之前我们说过编码的最高位都是零所以如果我们两个字节而之前我们说过编码的最高位都是零所以如果我们两个字节的。 Asthma进行一个区分好,那最终在计算机内部对汉字进行处理,其实就是使用这种汉字内码的编码方式,那我们这儿只是给出了汉字的其中一种编码方式,其实还有很多很多的编码方案,比如说大家经常听到的UTF8那挂考的同学也可以下去简单了解一下,好,那现在我们已经解决了汉字在计算机内部如何表示的问题,那我们还需要了解两个概念,叫做汉字的输入编码,还有汉字的字形码,顾名思义,输入编码就是用来输入汉字的,比如大家最熟悉的就是拼音,比如内这个汉字,如果用拼音输入,那么它所对应的输入编码就应该是NEI,然后再加某一个数字,比如说加上2那我们的输入法软件会把我们给出的输入编码把它转换成与之对应的国标吗然后再由系统或者软件。汉字内码,最终存储。让我们的输入法软件会把我们给出的输入编码,把它转换成与之对应的国标码,然后再由系统或者应用软件把国标码转换成与之对应的汉字内码,最终存储在我们的手机或者电脑里边,好,那这就是所谓的输入编码,输入编码比较符合我们人类理解的一个习惯,所以这就是用来把汉字输入到计算机里边的,那汉字要输出计算机需要用到另一种编码,叫做汉字的字形码,给大家一个图就明白了,比如你这个中文汉字,它其实呃就是由一个一个的这种像素点来组成的,那你这个汉字所对的字形吗如果用二进制的方式来看的话就是这样一个形式二进制唯一的地方这个像素点需要解释的地方表示这个像素点不须要显示所以胖子的所对的字形吗如果用二进制的方式来看的话就是这样一个形式二进制唯一的地方这个像素点需要解释的地方表示这个像素点不须要显示所以韩字的字形。需要把汉字内码呃转换成汉字的字形码,当然有可能是内码先转换成国标码,国标码再转换成字形码,好,那目前为止我们已经知道了英文的字符,还有汉字的字符怎么在计算机当中表示,那接下来我们来看一下字符串在计算机内部是如何存储的,假设某计算机按字节编制那所谓按字节编制的意思就是说每个内存地址会对应一个字节的内容,假设我们要存储ABC这样的一个字符串,从地址为2的单元开始,那这几个字符所对应的SB码分别是这样的,所以2这个单元它存储的二进制信息应该是61,然后三是62H,4是63H,也就是说一个字符串内的各个字符,从低地址到高地址一次被存放很多地方。在很多语言当中,为了标识一个字符串的结束,一般会在呃字符串的末尾,再加上一个字节的信息,也就是C语言里的赣灵这个字符,那这个字符的ask编码就是00H好,所以其实在我们这个地址,这还需要存放一个赣林的信息,那这就是ABC这个字符串在计算机里面的一个存储好,接下来再看带有中文字符的字符串,我们同样从2这个地址开始存放,ABC再存放一个R,那之前我们说过啊,这个汉字的机密码是B0,a1H B0是高位,自己a1是低位字节,那显然我们可以这么来存储啊,这个中文需要占两个字节,当然除了这种存储方式之外,其实还可以有另外一种存储方式,其实区别就在于这个朱文的高位字节河堤为自己的一个这个朱文的高位字节河堤为自己的一个存储。同样从2a1HB0是高倍资金,a1是低位资金,那显然我们可以这么来存储R,这个中文需要占两个字节,当然除了这种存储方式之外,其实还可以有另外一种存储方式,其实区别就在于R这个中文的啊,高位字节和低位字节的一个存储顺序不一样,这两种存储方式都是可以的,上边这种存储方式我们把它称为大端模式,就是指我们会把一个多字节数据的最高有效自己存到滴地址的部分这叫大端模式,而下面这种小端模式就是指把数据的高字节部分存到高地质单元当中,那至于为什么我们还会在之后的小结当中进行探讨,这只是给大家简单的提一下,因为我们的课后习题里面会遇到大端模式和小端模式这两个概念。了解即可好,那这个小节当中我们学习了字符和字符串,怎么在就是指和低位字节的一个存储数,这种小端模式就是指好这只这节即可好,那这个小节当中我们学习了字符和字符串,怎么在计算机当中表示,那英文字符一般是用ask码来表示的,每个字符占8个比特最高位都是0,值得注意的是啊,所有的大写字母,还有所有的小写字母,还有所有的数字,他们的编码都是连续的,这有可能作为考题进行考察,那对汉字的编码能有这个简要的了解即可,那区位码其实就对应了一个94行94列的,呃一个二维数组,然后所有的汉字都会被放到这个数组里面的某一个位置,所以一个区一个位就可以映射到一个汉字但是由于区位码的这个表示范围会在通信的时候问题所以我们需要在区位码机上二。所以我们需要在区位码的基础上加上2020H,这样就得到了可以用于数据传输的国标码,而为了实现汉字编码与ask码的兼容,所以我们又会在国标码的基础上再加上8080H以此得到机内码,那汉字在计算机内部就是用机内码的方式来存储的,当然再次强调,我们这只是给出了其中的一种编码方案,其实现在已经有更先进的编码方案了,另外我们还聊了输入编码和字形码,其实就是分别用于汉字的输入和输出的,最后我们介绍了字符串在计算机当中的存储,就是从低地址到高地址逐个存储字符串里的字符,那通常我们会在最后加一个杠铃来作为字符串的结尾标志,最后我们简单的提到了大多模式和小端模式这两个概念,这个知识点我们还会用之后的小结进行更进一步的解释,好的,那以上就是这些就。

2.1.4 字符与字符串编码