关于记事本的实现原理
关于记事本的实现原理
记事本是我们计算机上的最基础的文本编辑器,使用记事本我们可以写各种各样的文档,只要修改后缀就可以改变成我们想要的文档,比如我们可以使用记事本写Java文件,HTML文件等,那么记事本的实现原理是什么呢?
记事本和Word以及WPS的实现其实基本原理类似,只不过后两个加上了更多额外的附加功能,让我们编辑起来更加省力而已,他们基础的文件编辑功能的实现原理都是一样的,即编码。
在之前我已经总结过一次关于编码的问题,只不过那些总结更偏向于和Java程序结合,而不是我们的日常操作,因此在这里,我将从记事本或者WPS的角度来出发,从更加日常的角度来阐述一次编码在文本编辑器中的作用。
1.记事本的实现原理
记事本中其实存储的根本不是屏幕上所展示出来的点阵信息,这样的话一个文本文件势必占用大量的存储空间,早在之前的笔记中就已经提到过,在记事本中我们确实在屏幕上写上了点阵信息,然而根据我们输入法所映射成的东西根本不是这个文字形状,而是一串编码,也就是说,我们使用输入法打到电脑里边的,其实是一串串的编码,计算机的编码库中通常会存有这些编码的相关解码方式,只要有这个解码方式,计算机就可以实时的将这些编码输送给相关程序并通过解码方式将编码映射成字符形状并展现出来,这就是计算机显示字符的基本原理。因此,记事本的实现原理实际上为:
使用者通过键盘打字,输入法接收键盘的输入并将输入的字符通过自身程序转化为ANSL编码,ANSL编码实际上指的是这个地区常用的字符编码,或者说你电脑里系统默认的编码。输入法通过自身程序将键入的信息转化成相关的编码后,便会将这些编码实时的传到位于内存上的,正在被使用的文本文件程序中,这样一来,编码信息就流入到文本文件的进程上了,这是,记事本程序会检测到这些编码信息,于是它会将这些编码信息传入到计算机本地的编码库上,根据用户指定的编码方式进行解码,解码过程实际上就是在编码库中按照编码寻找相应的字符形状信息,找到之后,记事本程序就会将这些点阵信息发送到显存的相应位置上,也就是自己绘制的显示框上边,至此,文字形状正式绘制出来。
简单来说,我们可以说:记事本在存储文件时存储的是编码,在进行文本展示时会将这些编码根据编码库中的编码进行匹配解析,解析得到的点阵信息直接发送给显存,进而显现出来。
最后一点需要强调一个问题,就是关于编码的识别,记事本可以进行简单的编码识别,有些文件的头部会带有识别码,记事本通过这个识别码进行编码的识别,然后就可以知道这些文本是使用什么编码写的,然后去编码库中寻找指定的编码。
因此记事本的实现原理我们可以理解为:记事本通过文件头部的识别码确认文本书写的编码后,将文件中的编码信息发送到相关解码程序中,解码程序会根据本地公共编码库中的相应编码进行解码,解码后得到的点阵信息被放到显存中,计算机屏幕上显示出相关的形状信息。
2.扩展:编码与字体
我作为一个非常粗糙的直男,曾经对很多小姐姐以至于各种花样男子手机上乱七八糟的字体感到很诧异,因为我用了那么多年智能手机,从来没发现手机上的字体可以改的如此花里胡哨,直到我打开了“主题”,发现里边可以下载字体,下载字体并使用之后,我们就可以改变手机乃至电脑的字体了。在Word和WPS中也有相当多的字体,但是都得下载之后才能使用,同时我们发现,使用自己下载好的字体编写的文件,在其他人的电脑里可能就会变回平凡的普通字体,这揭示了一个道理:字体也是一种编码。
字体算是编码的一种,它算是一种扩充编码,即在普通编码的基础上进行扩展,普通编码加上扩展编码,就可以被识别成特殊字体进而进行展示,在我们的计算机中,存在一个字体库目录,如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HpaDyiLu-1642493545734)(D:\MarkDown文件\2022.1.6\2.png)]
这里边的各种文件实际上就是字体,每一种字体也有自己的编码,通常来讲这种编码是在基础文本的编码上进行扩充得到的,只要计算机的这个目录下有某种特定的字体,那么计算机就可以识别这种字体并进行点阵映射。
3.Word和WPS的实现原理
Word和WPS的实现原理其实和记事本非常类似,只不过他们加了非常多的辅助技能以及加装了字体库,这样一来文本信息不止步于基础的编码,每一种基础的语言编码不再有单调的形状,而是具有了很多的扩展形状,Word和WPS可以对我们键入的编码进行修饰,进而改造成字体库中字体编码可以识别的编码,进而使用字体库中的其他字体的编码进行解码,这样一来就可以解码出更加有趣的形状,如同样的汉子,就可以有宋体楷体以及微软雅黑等不同的形状。
同时我们也注意到,同样的字体,如楷体,可以等比例放大缩小,变颜色,这是为什么呢。理论上讲,Word和WPS中的每一种字体和颜色,以及大小,样式也都具备自己的编码,因为他们的形状不同。然而这样做的话就会需要大量的额外空间进行编码存储,因此在Word和WPS中并不会单纯的通过不同样式的字体文件扩充字体库来进行同一字体不同样式的展现,而是采用了矢量计算的方式解决这个问题,也就是说直接对点阵信息进行函数计算,让它表现出各种样式,而不是真的为其设计一款自己的点阵信息,也就是说某个字可能只有一个点阵形状,它对应的其他形状的编码并没有自己的点阵信息来对应,有的只是一个矢量计算函数,这个函数可以让这个点阵信息在不失真的情况下发生各种颜色变化以及形变,进而进一步节省了空间。
当然这种矢量计算是非常耗费时间的,但是它节省空间,因此Word和WPS采取了一种折中的办法,即对于常用字体,它的每一种大小,颜色变化等样式形状,确确实实真的有一个字体文件与之对应,然而对于一些不常用的字体,就需要一个函数进行矢量计算了。Word的占用空间比WPS大得多,就是因为Word自带了更多的字体文件,因此很多人都说“Word快”,实际上Word是牺牲了空间获取了时间,当遇到生僻字体时,Word同样需要进行长时间的运算才能更改字体的样式,而WPS作为一个轻量级的文本编辑器,则很少带有现成的样式编码,在WPS中,对于样式的修改更多的使用了矢量运算,因此很多人说WPS卡。
以上就是记事本以及Word等编辑器的实现原理,在此我附上我的原始笔记,同时在日后的学习中我仍然会复习这一块并进行一些勘正,以及进行更加深入的探讨。
记事本的存储原理:每种文件的最前面有一个识别码,计算机通过这个识别码来识别出文件采用的是哪种编码,然后识别后就用相对应的解码方式进行解码即可。去找相对应的形状库进行解码。形状库中对于所有字符都有相对应的编码,甚至于换行符等不显示的字符也存在自己所对应的编码。
实际上每个文件在其头部都有自己的信息,其中就包括种类信息,操作系统是通过头部信息对于各种文件进行定位,解析,运行的,这是操作系统中之前讲过的东西。
然后就是编码,编码其实就是机器代码和某一个形状库对应的映射关系,在形状库中所有需要显示或者对显示有影响的字符都有自己对应的形状,这里是一个重要的面试题,即记事本打开文件信息的原理。记事本程序会识别文件类型然后进行解码,然后将显示信息翻译出来发送到屏幕,具体解码方式其实大部分是手动的,因为的自己设定编码类型。
字体其实也是一种编码,这种编码是非公开编码,记事本打开word文档通常是乱码,因为每一个形状都是一个编码
记事本中只有公共编码,通常来说没有word那么多花里胡哨的功能,记事本的编码库相对来说非常简单,但是word的编码库就加上了颜色和亮度,就显得非常复杂。对于字体的大小,可以对于每一个字号都记录编码,也可以根据其形状进行实时计算来操控大小,但是计算的话就很慢。速度最快的情况,其实就是让一个字的每个表示都有相对应的编码值
常用字体的常用字号才会设置编码值,不常用的字号才会实时计算,如果都有自己的编码值,那就体量太大了。
word常用的性能是快于wps的,原因就在于常用的进行优化。这也是word为什么会更大的原因。
真的是每一种字体都有自己相对应的编码吗,不是的,有些字体其实是有关联的,只需一个函数计算映射,就可以将一个编码转化成另一个编码,这样差距不大的字形,就可以只有一套编码,然后其他字体通过模板进行函数映射,进而得到其他编码,得到其他字形。在word里很多字体也是公用一套编码,然后对点阵进行函数计算。
word文档本质还是操作编码并进行显示,
word也是根据编码进行操作,读编码,显示编码
头部指定哪种编码,然后再等长度的往里边往,一个长度一个长度的往里边读。