> 文章列表 > 操作系统、输入法和编码的理解

操作系统、输入法和编码的理解

操作系统、输入法和编码的理解

操作系统和输入法

操作系统有一个输入法管理器,叫做IMM,管理系统内的所有输入法,或者说一个输入法想要使用操作系统提供的输入法API,就必须在IMM进行注册。

应用程序和输入法

应用程序一般都会使用输入法,也就是调用输入法的api进行文字输入。比如你想要使用文本编辑器txt保存“我爱你”三个字,那么打开txt的时候,txt会通过操作系统来调用某个输入法,具体调用哪个输入法取决于当前系统。

输入法的原理和功能

输入法的原理很简单,就是监听键盘输入,然后生成对应的字符,比如当用户输入模式为中文的时候,监听到键盘输入了"w",那输入法会弹出可选的文字框:
操作系统、输入法和编码的理解如果监听到用户输入了2,那么输入法就产生了“为”这个字符,然后把“为”发送给应用程序。

输入法的编码

那么输入法产生的“为”到底是什么编码呢?这取决于应用程序的上下文,每个应用程序都有自己的编码或者默认编码,比如txt采用系统的默认编码,idea可以在右下方选择操作系统、输入法和编码的理解

输入法(或者操作系统,具体我也不清楚)可以通过某个API获得这个编码类型,然后按照应用程序的编码类型把“为”交给应用程序,应用程序的内存里就有“为”的指定二进制编码。

解析文件时编码错误不可逆问题

一旦使用错误的编码进行解析,将会导致解析失败,失败的原因是无法识别对应的一些字符,当无法识别时,常用的解决办法是使用�或者?替换,一旦替换过后,原来的二进制编码就会改变,从而无法恢复。
比如,txt文件中有一个文字“中”,使用的是gbk编码保存,根据GBK编码规则硬盘中保存的是
D6 D0,也就是11010110,11010000两个字节。 当我使用idea打开这个txt文件时,如果以UTF-8的编码格式进行读取,那么idea将会以UTF-8的规则去读取D6 D0这两个字节,然而根据utf-8的解析规则,是无法解析11010110,11010000两个字节的,UTF-8遇到无法解析的字符一律以�替代。当无法解析11010110时,为了显示这个字符,就以�来替代11010110,同理,也会以�替代11010000,那么idea中显示的是��而不是汉字“中”,出现了乱码。�的UTF-8编码是11101111 10111111 10111101三个字节,此时这三个字节还存在与idea的内存中,硬盘上保存的还是GBK编码的D6D0,因此如果此时在idea上以GBK编码的格式重新读取文件时,idea能够正确的解析D6 D0显示汉字“中”,但是在UTF-8格式解析时,一旦在idea上进行保存,比如添加一个“国”字,此时idea内存中将会是�的UTF-8编码和“国”的UTF-8编码,因为进行了修改操作,idea默认进行保存,那么idea就会把内存中的数据写到原来的TXT文件上,此时硬盘中本来是11010110,11010000两个字节,此时就会变成�的UTF-8编码11101111 10111111 10111101三个字节,加上“国”字的三个UTF-8编码的三个字节。此时”中“并不会变成并不是变成UFT-8编码格式,而是被替换修改,无法恢复!
因此一旦出现编码错误,不要保存!否则原来的内容都会被类似�的替换字符替换掉!

  • 以上仅个人理解,有错勿喷*

大连人才网