从早期的CCDOS、WPS到UCDOS、中文之星、Richwin,从中文Windows3.x到中文Windows95/98,其所带的中文输入法可谓多种多样、各具特色,新的中文输入法也在不断地出现。但无论是何种中文系统或平台,全拼输入法、双拼输入法(简拼输入法)则可说是都有的。这类输入方法简单实用,不需专门学习。以笔者个人的经历和体会,面对汉字输入法“万码奔腾”的局面,用户个人的最好对策就是以不变应万变,使用自己熟悉的某种汉字输入法。我们大多数人都不是作专业的汉字录入工作,只要所用输入法自己觉得满意,能够应付日常所需就行。如果输入法象时装一样随时在变,而用户又总想赶上潮流的话,恐怕没有那么多的时间去熟悉不断出现的五花八门的输入法。
以双拼输入法为例,由于其易于学习,击键少,熟悉之后输入速度也较快,因此有大量的用户使用这种输入方法。许多用户早期在DOS下就已经熟悉并使用这种方法。笔者从DOS下使用WPS开始就一直使用这种方法。但问题在于,目前不同的操作系统或中文平台所提供的双拼输入法对双拼键位的定义各不相同。中文之星、UCDOS和Richwin不同。Windows3.x和Windows95/98对双拼键位的定义也有差别。这就给用户使用带来了不便。使用双拼输入的用户都知道,习惯一种双拼键位以后,要改成另外一种键位总是不那么习惯。正因如此,虽然Windows3.x和Windows95/98都带有双拼输入法,很多用户还是不习惯使用,有不少用户仅仅是为了使用其熟悉的新双拼输入法而外挂中文之星等,甚至有人专门探讨如何不安装中文之星而加载其双拼输入法。其实,最好的办法是无论使用哪种环境下的双拼输入法都能够随意地将双拼输键位改成自己习惯的模式而又能够很好地利用现有资源。我们知道,在Windows3.x下可以利用修改Winpy.ini文件方便地定义自己的双拼键位,遗憾的是在中文Windows95/98中没有提供类似的方法。不过,我们可以利用Windows95/98提供的输入法生成器方便地实现这一点。同样,我们也可以据此随意定义自己的中文输入法。这便是本文的目的。
中文Windows95/98输入法生成器的用法及其码表源文件(.TXT)的结构很简单,可参见其帮助文件,这里不赘述。在中文Windows95/98中扩充任何一种汉字输入法,第一步都是由用户生成一个码表源文件(.TXT)。只要生成了码表源文件,用户可以根据自己的需要在中文Windows95/98中扩充各种汉字输入法,甚至是用户自己编码的汉字输入法。于是问题的关键变成如何获得码表源文件。有很多方法可以实现这一点。例如,有文章介绍可以利用UCDOS5.0的输入法管理器把UCDOS5.0的汉字输入法编码字典转换成编码文本文件,再通过编程实现编码源文件向Windows95/98格式的码表文件的转换。最后用输入法生成器对码表源文件进行编译并安装挂接来实现输入法的扩充。这不失为一种好的方法。其实,我们可以直接利用Windows95/98自带的输入法来获得并定义自己的码表源文件,从而生成自己熟悉的中文输入法。例如我们可以将Windows95/98的双拼输入法变成UCDOS或中文之星(或任意格式)的双拼输入法。这样,既能适应用户个人的习惯,又能合理利用Windows95/98现有资源,如利用Windows95/98双拼输入法中现有的近3万个词组(其帮助文件上说是48,000 条词汇),不需要仅仅为了某种输入方法而在中文Windows95/98中外挂其它的中文平台,等等。这就是本文要介绍的方法。本文以对Windows95/98双拼输入法的修改为例加以说明,对其它输入法的扩充可类似处理。具体过程为:
1. 单击“输入法生成器”,将欲修改的输入法的码表源文件逆转换出来。这里我们选择中文Windows95/98双拼输入法进行逆转换。单击“逆转换”、单击“打开文件”,选择“c:\windows\system\winsp.mb”(假定winsp.mb存于该目录下),单击“逆转换(R)”,即可得到该输入法的码表源文件。其格式如下:
[Description]
Name=双拼
MaxCodes=12
MaxElement=1
UsedCodes=;abcdefghijklmnopqrstuvwxyz
WildChar=?
NumRules=3
[Rule]
ca4=p10+p20+p30+p40
ce2=p10+p20
ce3=p10+p20+p30
[Text]
啊a
阿a
阿爸aba
阿昌aih
阿拉伯数字alabouuzi
阿拉善盟alaujmg
…………
栖qi
栖xi qi
…………(共计36135条)
其中[Description]和[Rule]区段可根据需要修改。[Text]区段的格式为:
[汉字][编码] [构词码]
[汉字]与[编码]之间无空格,[编码]与[构词码]之间有一空格,[构词码]可以为空。
理论上来说,只要将该码表中所用的双拼键位修改成自己习惯的键位再用“输入法生成器”对其转换、创建即可得到自定义的中文输入法。例如,Windows95/98双拼输入法中用D代表韵母uang,iang,而我们想用H代表,则只需将码表中代表韵母uang,iang的D换成H即可。事实上要这样对全部码表进行修改是比较困难的。首先,我们不难想到,不能用简单的依次替换的方法来进行修改,这势必造成码表的混乱。其次,虽然双拼输入法只用两个拼音字母表示一个汉字,只要二次击键就可以输入一个汉字的读音,但由于零声母的存在,多字词组输入码中韵母的位置不确定。例如,“阿昌aih”的输入码中韵母h(cang)在第3位;“西昌xiih” 的输入码中韵母h(cang)在第4位。这就给码表的修改带来了困难,需要对码表作一些处理。
2. 分析码表发现,单个汉字的双拼代码声母和韵母的位置是有规律可寻的,因此我们可将码表中的单字和词组分离,由此分别获得国家标准 gb2312-80 中规定的全部汉字及其词组。我们只需要修改单个汉字的双拼代码,而词组的码表可用“输入法生成器”的批量造词功能生成。例如,我们可以用一段简单的程序(附后)将“Winsp.txt”分解成“单字.txt”和“词组.txt”两个码表(假定都位于“c:\windows\system”下)。
这样得到的两个码表文件的格式为:
单字.txt:
…………
啊a
阿e a
呕b
…………
粑ba
…………
呵he a
行hh hg
广j gd
…………
肀pmph
词组.txt:
…………
中华民族vshwmnzu
中华全国妇女联合会vshwqrgo
中华全国工商联合会vshwqrgo
中华全国总工会vshwqrgozsgs
中华人民共和国vshwrfmngshe
中华儿女vshwrnv
…………
通过分析可以看出,单个汉字的双拼代码的排列形式只有上面列出的几种,即绝大部分单个汉字是由声母和韵母各用一个字母构成的双字母代码(只有编码,没有构词码),部分零声母汉字只有一个代码(只有编码),部分为双音字(有编码和构词码),还有几个偏旁是用“偏旁”二字的双拼“pmpj”为代码。这就为我们据此定义自己的双拼码表提供了方便。
3. Windows95/98双拼输入法中声母、韵母与键位的对应关系为:
键位
I
U
V
O
声母
ch
Sh
Zh
零声母
键位
Q
W
E
R
T
Y
U
I
O
P
韵母
iu
ia,ua
e
uan,er
ue
uai,ǚ
u
i
o,uo
un
键位
A
S
D
F
G
H
J
K
L
;
韵母
ong,iong
uang,iang
en
eng
ang
An
ao
ai
ing
键位
Z
X
C
V
B
N
M
韵母
ei
ie
iao
ui,ue
ou
in
Ian
假定我们将上面的双拼键位规定为下面习惯的格式:
键位
Q
W
E
R
T
Y
U
I
O
P
韵母
er
ei
e
en
eng
ong,iong
U
i
o,uo
ou
键位
A
S
D
F
G
H
J
K
L
;
韵母
ai
ao
an
ang
uang,iang
Ian
iao
in
ing
键位
Z
X
C
V
B
N
M
韵母
un
Uai,ǚ
uan
ui,ue
ia,ua
iu
Ie
我们只要找到韵母在码表中的位置,确定两种双拼代码之间的变换关系就能够方便地修改并建立自己的双拼码表。如用N代替Q,B代替W等等。可用一段简单的程序来方便地实现这一点(程序附后),要修改双拼键位,只需要修改程序中与原来键位对应的代码表即可(newcode$)。这两步虽然看起来较繁琐,但一旦建立了单个汉字文件和转换程序,以后就可以随时以个人的需要重新定义自己的输入方法。假定转化后的单个汉字码表源文件为“winnsp.txt”,我们称之为基本码表。
4. 利用“输入法生成器”创建新的双拼输入法。单击“创建输入法”,单击“浏览”打开新生成的基本码表“winnsp.txt”,假定输入法名称为“新双拼”,单击“转换”、“创建”并选择“安装”就获得了新的输入法。
5. 单击“批量造词”,目标输入法选择刚生成的“新双拼”,打开前面的词组文件“词组.txt”,单击“全选”、“自动编码”、“保存”,就可得到按照新的双拼规则重新编码的词组码表文件(假定仍以“词组.txt”存盘)。若词组文件太大,可将其分为几个文件,编码后再合并。采用同样的方法也可将用户自定义的任何词组重新编码。
6. 合并单字码表和词组码表(“Winnsp.txt”和“词组.txt”)得到完整的新双拼码表,重复步骤4即得到包含单个汉字和全部词组的新的双拼输入法。
生成新的汉字输入法的关键是对码表源文件中TEXT段的组织。该部分数据量大,包括输入法中的所有字词及其对应编码,象这样只处理单个汉字的编码,数量可大为减少。本法巧妙利用中文Windows95/98中现有中文输入法的中文码表,生成的输入法具有中文Windows95/98自带的汉字输入法的所有特点,如词语联想,外码提示、光标跟随、逐渐提示等功能。
附:
1.将码表分解成单个汉字和词组的简单程序(使用中文VB5)
Private Sub Command1_Click()
Open "c:\windows\system\winsp.txt" For Input As #1
Open "c:\windows\system\单字.txt" For Output As #2
Open "c:\windows\system\词组.txt" For Output As #3
Do While Not EOF(1)
Line Input #1, mb$
ascmb1 = Asc(Left$(mb$, 1)) '码表第一个字符的ASCII
ascmb2 = Asc(Mid$(mb$, 2, 1)) '码表第二个字符的ASCII
If ascmb1 > 64 And ascmb1 < 123 Then '将码表Description段和Rule段写入"单字.txt"
Print #2, mb$
Else
If ascmb2 > 96 And ascmb2 < 123 Then '分解单字和词组
Print #2, mb$
Else
Print #3, mb$
End If
End If
Loop
Close #1, #2, #3
End Sub
2. 重新定义双拼键位的简单程序(使用中文VB5)
Private Sub Command1_Click()
Open "c:\windows\system\单字.txt" For Input As #1
Open "c:\windows\system\winnsp.txt" For Output As #2
oldusedcode$ = ";abcdefghijklmnopqrstuvwxyz" '原来的双拼代码
newcode$ = ";apkhertgifdsjlozncyvuvbmxw" '对应的新双拼代码
oldusedcode_zero$ = "abefghijklmnoqrz" '原来零声母韵母的双拼代码
newcode_zero$ = "apertgifdsmnonqz" '对应的零声母韵母新的双拼代码
Do While Not EOF(1)
Line Input #1, mb$
mb_len = Len(mb$)
If mb_len = 2 Then '单音零声母韵母
mb_left$ = Left$(mb$, 1)
code$ = Right$(mb$, 1)
Where = InStr(oldusedcode_zero$, code$) '确定该零声母韵母在原代码表中的位置
mb_right$ = Mid$(newcode_zero$, Where, 1) '换成新的双拼代码
mb$ = mb_left$ + mb_right$
End If
If mb_len = 3 Then '一般单音字
mb_left$ = Left$(mb$, 2)
code$ = Right$(mb$, 1)
Where = InStr(oldusedcode$, code$) '确定韵母在原代码表中的位置
mb_right$ = Mid$(newcode$, Where, 1) '换成新的双拼代码
mb$ = mb_left$ + mb_right$
End If
If mb_len = 4 Then '多音零声母韵母
mb_left$ = Left$(mb$, 1)
code1$ = Mid$(mb$, 2, 1)
code2$ = Mid$(mb$, 4, 1)
where1 = InStr(oldusedcode_zero$, code1$) '确定第一个韵母在原代码表中的位置
where2 = InStr(oldusedcode_zero$, code2$) '确定第二个韵母在原代码表中的位置
mb_mid$ = Mid$(newcode_zero$, where1, 1) '换成新的双拼代码
mb_right$ = Mid$(newcode_zero$, where2, 1)
mb$ = mb_left$ + mb_mid$ + " " + mb_right$
End If
If mb_len = 5 Then '多音字和偏旁
spacew = InStr(mb$, " ")
If spacew = 3 Then
mb_left$ = Left$(mb$, 1)
code1$ = Mid$(mb$, 2, 1) '多音字的第一个读音为零声母
mb_mid2$ = Mid$(mb$, 4, 1)
code2$ = Right$(mb$, 1)
where1 = InStr(oldusedcode_zero$, code1$) '
where2 = InStr(oldusedcode$, code2$)
mb_mid1$ = Mid$(newcode_zero$, where1, 1)
mb_right$ = Mid$(newcode$, where2, 1)
mb$ = mb_left$ + mb_mid1$ + " " + mb_mid2$ + mb_right$
End If
If spacew = 4 Then
mb_left$ = Left$(mb$, 2)
code1$ = Mid$(mb$, 3, 1) '多音字的第二个读音为零声母
code2$ = Right$(mb$, 1)
where1 = InStr(oldusedcode$, code1$) '
where2 = InStr(oldusedcode_zero$, code2$)
mb_mid$ = Mid$(newcode$, where1, 1)
mb_right$ = Mid$(newcode_zero$, where2, 1)
mb$ = mb_left$ + mb_mid$ + " " + mb_right$
End If
If spacew = 0 Then '偏旁
mb_left$ = Left$(mb$, 2)
mb_mid2$ = Mid$(mb$, 4, 1)
code1$ = Mid$(mb$, 3, 1)
code2$ = Right$(mb$, 1)
where1 = InStr(oldusedcode$, code1$) '
where2 = InStr(oldusedcode$, code2$)
mb_mid1$ = Mid$(newcode$, where1, 1)
mb_right$ = Mid$(newcode$, where2, 1)
mb$ = mb_left$ + mb_mid1$ + mb_mid2$ + mb_right$
End If
End If
If mb_len = 6 And Asc(Left$(mb$, 1)) < 0 Then '正常多音字并判定首字是否汉字
mb_left$ = Left$(mb$, 2)
mb_mid2$ = Mid$(mb$, 5, 1)
code1$ = Mid$(mb$, 3, 1)
code2$ = Right$(mb$, 1)
where1 = InStr(oldusedcode$, code1$) '
where2 = InStr(oldusedcode$, code2$)
mb_mid1$ = Mid$(newcode$, where1, 1)
mb_right$ = Mid$(newcode$, where2, 1)
mb$ = mb_left$ + mb_mid1$ + " " + mb_mid2$ + mb_right$
End If
Print #2, mb$
Loop
Close #1, #2
End Sub
|