Delphi实现汉字拼音简码
编程爱好者
去药店买药,偶然发现药店用的医保卡售药系统在输入药品名称时很方便,当需要输入“脑白金”时,操作员只需要输入“NBJ”就可以。药品数据库里存储了药品名称的拼音简码,这样可以提高检索速度,极大地方便了用户。那么在入库操作时输入药品名称能不能自动获得拼音简码呢?经过查找资料,找到方法,介绍一下大家分享。
首先需要先简单介绍一下区位码和机内码。GB2312-80的国家标准将汉字和其他符号按照一定的规则排列成为一个大的表格,在这个表格中,每一行(横)称为一个“区”,每一列(竖)称为一个“位”,一个两位10进制的区码加上一个两位10进制位码就可以唯一地表示一个汉字。在这个表格中,常用的一级汉字是按其拼音的英文字母的顺序排列的。我们可以找到一张汉字区位码的对照表,查出拼音以某个字母为首的汉字的区位码起止码。
比如:拼音以“a”为首的汉字第一个字为“啊”,它的区位码为“1601”,最后一个汉字为“澳”,它的区位码为“1636”。 汉字机内码是在计算机内表示汉字的代码,汉字机内码由四位16进制数组成。汉字机内码和区位码是对应的,我们把区位码的区码和位码分别加160然后转换成16进制数就可以得到其对应的机内码。例如:汉字“啊”,它的区位码为1601,区码16+160转换为16进制数为B0,位码01+160转换为十六进制数为A1,那么它的机内码为:B0A1。
这样就可以解决问题了,首先取得输入的汉字的机内码,然后把它转换成区位码,最后判断它属于哪个区间,从而得到它的拼音的第一个字母。
下面举一个简单的例子:在输入汉字时自动给出汉字的简拼(如图)。

1.启动Delphi,选择“File”菜单的“New Application”新建项目,在新建的窗体上放置Tedit、TLabel、Tbutton等组件。
2.添加如下程序代码。
function getPY(hzchar:string):char;
begin
case (WORD(hzchar[1])-160)*100+WORD(hzchar[2])-160 of //获取区位码
1601..1636 : result := 'A'; //判断区位码值获得字母
1637..1832 : result := 'B';
1833..2077 : result := 'C';
2078..2273 : result := 'D';
2274..2301 : result := 'E';
2302..2432 : result := 'F';
2433..2593 : result := 'G';
2594..2786 : result := 'H';
2787..3105 : result := 'J';
3106..3211 : result := 'K';
3212..3471 : result := 'L';
3472..3634 : result := 'M';
3635..3721 : result := 'N';
3722..3729 : result := 'O';
3730..3857 : result := 'P';
3858..4026 : result := 'Q';
4027..4085 : result := 'R';
4086..4389 : result := 'S';
4390..4557 : result := 'T';
4558..4683 : result := 'W';
4684..4924 : result := 'X';
4925..5248 : result := 'Y';
5249..5589 : result := 'Z';
else
result := char(32); //输入非一级汉字得到空格
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
I: Integer;
hz: string;
begin
EDIT2.Text:='';
for I := 1 to Length(edit1.Text) div 2 do //因一个汉字占用两个字节所以除以2
begin
hz := Copy(edit1.Text, I * 2 - 1, 2);//取得指定位置的汉字
EDIT2.TEXT:=EDIT2.TEXT+ getpy(hz); //获取汉字拼音首字符
end;
end;