文件的输入法程序的字符编码

什么是编码

编码的定义是把一种信息转化成另一种格式的信息,把饭菜用图片做一一对应,把声音用磁带记录做一一对应,把一些字符用01二进制码做一一对应,把01代码用电压高低做一一对应,把另一些可视化字符和二进制码做一一对应;

字符集和字符编码

字符集是一个字符的集合,同时把这个字符集内的每一个字符都用一个二进制码做一一对应关系;ascii是英文字母和标点符号的字符集,unicode是全世界字符和标点符号的字符集合,gb2312是中文简体的字符和标点符号的集合;每一种字符的集合都做了一个二进制值做对应关系;ascii用了一个字节,unicode目前是两个

有的字符集只是字符集合,只是规定了用多少个字节表示,但是没有说哪一个字符是怎么个具体的值;所以制定具体的值才叫做字符编码,utf-8,utf-16都是对unicode的具体的编码,而且是不定长编码,utf-8汉字用两个字节英文用一个字节;但是有一些字符集在制定的时候同时也做了编码,比如ascii和gbk,gb2312既是一个字符库又对字符的二进制码作了具体的规定;

对字符编码的二进制码的编码

前面是把字符用二进制值编码,这里是把这些二进制码用可打印字符表示,但是这不是一个逆过程;比如 \u0057\u006f, \t ,78,等这些表示的都是二进制值,我们用可看到的标识符对二进制值做一一对应关系,\u0030表达式的字符’0’的值,而不是\、u、0这些符号的值,在文件保存的时候\,u、0这些符号的值由汇编语言我们处理保存,我们不可能写一堆0101101001所以用这些可以打印的字符,规定了一个码值和标识字符来表示这些值;

  1. unicode 字符的表示就是用 \u+16进制码制字符,表示的

  2. ascii 直接用 直接的十进制或者其他进制值表示也可能需要加’\’

  3. 转移字符 这些不可打印的字符是没法直接敲出来的,posix格式下的就是用 \t这样的C语言风格表示

  4. base64是用64个可以打印的字符表示任何二进制值,字符集包含的64个字符是可以换的是一个算法

这些二进制编码的格式需要对应编程语言的支持才行,比如html就不支持c语言风格的转义字符,想要打印这些字符需要输入 &It;诸如此类的符号来表示;

编程语言中的字符变量

所有的变量的值其实都是数字,比如在c语言等强变量语言中你可以这样给一个字符变量赋值char ch=78这个ch的值是78对应着ascii字符’N’,这和char ch='N'的效果是一样的,你可以拿这个ch和其它类型的变量int等做数学加减乘除运算;他们的区别是系统的打印函数print等一些函数对这个字符变量的行为不一样,对一个int变量赋值78打印输出还是78而对前面的ch输入是显示N;

文件的编码

文件的编码可以分为这三个关注点

  • 文件内的数据的本身编码
  • 编辑器处理字符的编码格式(输入法程序也有这个属性)
  • 以什么编码打开文件
  • 以什么编码写入数据
  • 系统环境字符编码

文件的打开格式是很重要的,比如一个utf-8文件你用gbk的编码打开就是乱码的,用编辑器是没法选择用什么格式打开;因为编码打开格式一般会和系统一样,系统当前是gbk文件编辑器的编码格式就是gbk,就会以gbk的编码打开,写入数据,在idea软件内可以点击右下角部分的字符编码选择以什么格式打开,不过也是需要在打开文件后才能进行;

在txt文本编辑器下写入文件后可以选择以什么编码格式保存;

在windows可视界面操作下字符集是utf-8而且不能修改,utf-8是个很大的字符集,必须下载相应的语言包才行,在win10的系统设置内设置语言就是选择utf-8的语言包;

cmd的编码格式默认是gbk,可以通过chcp命令来修改;

当你在text文件内写了一个含有中文注释的uft-8的java源代码,在cmd中进行编译就会出错,因为此时的系统环境是gbk而javac编译器会默认以系统提供的编码格式进行处理数据,所以你可以javac -encoding utf8命令格式编译,或者用chcp改变cmd环境来进行编码就可以识别中文字符了;

在编程语言内对文件的操作默认操作,读操作和写操作也是取决于java所运行的系统环境,比如这个读操作,分字节流和字符流,那么读取一个字符是几个字节呢,java并没有做出规定,因为这个取决于以什么环境读,以utf-8或者ascii或者gbk是不同的格式,读取的字符的长度也不同,不过java可以指定字符编码格式进行读或者写操作;

输入法程序原理和系统是怎么显示字符的

系统显示字符的方式是因为操作系统具有字符集的编码,比如windows是支持中文字符的,它的语言组件内部就有对应的utf-8的中文的编码字库,当需要显示一个中文字符的时候,windows会查找这个字符的编码和对应的如何使显示器显示这个字符的图形矢量标记;这个图形矢量标记就是一个数据结构变量,保存了一个显示器如何打印一个字符;一个utf-8字符编码和其字符图形数据结构变量是一一对应的;

操作系统对输入输出的规定是,操作系统提供显示组件,程序调用这些组件,比如文本输入框,当一个文本输入框被鼠标或者手指点了一下,它会像系统发送一个输入事件,系统此时会调用系统的输入法程序,然后此时输入法程序此时开始接收键盘的命令,输入法程序根据键盘输入的数据,来判断要显示一个什么字符,但是键盘一般都是英文的,不可能一个键盘具有300多个中文字母按键,所以我们按下一些字母,输入法程序只能接收到这些按键的ascii码值,然后根据输入法程序的词库匹配,比如输入了ni两个字母的ascii码值,输入法程序根据这个组合查找到是‘你’中文字符,然后它会向系统发送一个该中文字符的编码值,这个值可能是unicode的,可能是utf-8的,可能是gbk的,也可能是其他语言,韩语,日语等。然后系统就会显示这个字符在鼠标或者手指点击的地方,但是此时数据是没有保存的,如果不选择数据的保存编码格式,它会以系统默认的编码格式保存这些数据;输入法如果只支持utf-8不支持其它字符编码,比如系统是gbk编码,这个输入法接收了数据给系统发送了一个‘你’字符的utf-8值,系统会根据gbk的库来显示这个值的字符就乱码了;所以输入在安装的时候如果它不支持多字符编码环境是没法用的,或者它不能自己选择编码方式;

输入法程序的组成结构

  • 输入法程序需要先注册进系统,然后被系统选择使用才可以,安卓是用xml方式注册,windows是用ime文件方式注册,需要调用系统函数注册这些文件;
  • 输入法程序需要系统的 IME(Input Method Editors 输入法编辑器)API来提供支持,输入法程序需要调用这些组件来和系统进行交互
  • 有的系统支持编辑器在被激活的时候可以显示可视化界面,就像我们打字的时候地下会有一个小横杠,显示了许多可以被选择的字,而英文输入法,不会显示因为键盘和字符是一一对应的,他没有做可视化界面的编程

对于有些系统,比如linux的bash环境,它的系统IME组件就没有提供可视化的组件,所以打字的时候不会有可以选择的小横杠;还有当你选择了cmd的编码格式是比如是韩文字符编码吧,你在cmd内用中文输入法或者英文输入法打字的时候,小横杠提供的是中文(英文输入法没有小横杠),但是按下回车键显示的确实韩文,而且是乱码的韩文,这是因为cmd,bash环境的输入法api是不支持小横杠可视化组件的,支持可视化组件的是运行cmd的windows和bash的ubuntu。当然自己做个词库是不可能的,目前这个开源时代有很多可以用的库;

两个输入法程序资料,输入法api资料很少,特别是windows的,我根本找不到https://baohaojun.github.io/blog/2013/10/04/0-Win32-IME-Programming.html

http://www.splaybow.com/post/windows-english-version-support-chinese.html

第一台支持中文的电脑和操作系统

前面的内容可以看出,显示中文需要一个字符编码和对应的图形显示数据结构变量数据库才行,所以早期的国外电脑是不支持中文的,支持中文的第一个操作系统叫做CCDOS,他是一个磁盘操作系统,早期磁盘系统还是比较容易实现的,这个操作系统是由王选做的,第一台装配这个操作系统的电脑叫长城0520;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值