在使用电脑编辑文档的时候,输入汉语拼音再加上它的声调,是一件令人头痛的事情,特别对于那些经常接触拼音的教师、家长和孩子。虽然 Office XP中已经加入了自动标注汉语拼音的功能,不过,Office XP要####.00元哦。对于没有用上Office XP的人来说,难道就没有办法享受到这种便利吗?好在我们学习了编程,就自己动手吧!

这篇文章不仅仅是说明如何实现自动标注汉语拼音编程的,我的主要目的是演示解决问题的一般步骤。

就本问题来说,你是不是有种不知如何下手的感觉?想一想我们在编写汉字GB-BIG5相互转化时的做法:把每一个汉字的GB码、BIG5码都列出来,并一一对应。我们可以仿照这种方法,把每一个汉字(至少6763 个!!!)对应的拼音都列出来,然后就可以查询了。

不过,我相信你和我一样是懒惰的,懒惰的人通常会花费几倍的时间去找个可以懒惰的办法来。最懒惰的办法是……捡个现成的!先到网上问问看,就选大富翁论坛吧。这里不是大富翁游戏爱好者交流经验的论坛,而是专门讨论Delphi编程的地方,人气也好。登录http://www.delphibbs. com,免费注个册,问问看有没有谁知道如何编,或者能提供个组件什么的。记住要选邮件通知,如果有人回答问题,论坛会自动发邮件通知你,然后你就等着吧。

闲着也是闲着,在等待的时候我们也该做点什么。首先,应该想到 MSDN,它可是程序员必备的编程参考书(软件)。在MSDN中输入spell 或phoneticize查一下,看看有没有我们想要的信息。你就沿着这条思路试试吧。

http://www.gaodaima.com/?p=65953用Delphi 6编程实现自动标注汉语拼音_Delphi

还可以想一想,我们以前使用电脑接触到有拼音的地方。输入法!对了,就是拼音输入法!输入拼音我们可以得到汉字。我们能不能通过一种逆运算,输入汉字得到这个汉字的拼音?回答当然是肯定的,这也是本文推荐的方法。

这种方法实际上就是得到汉字的字根。我们仍然可以上论坛去询问,到 MSDN中查找,不过问题要改为“如何得到汉字的字根”。不用说,你已经可以解决本问题了。实际上,此编程主要用到三个函数:

GetKeyboardLayoutList:得到当台计算机中存在的输入法列表;

ImmEscape :得到输入法的名称;

ImmGetConversionList: 看看这个输入法是否支持Reverse Conversion功能,如果支持则继续使用此函数,可取得组字字根信息。

现在简单了,打开Delphi 6,添加两个TEdit控件、三个TBitBtn控件、一个TOpenDialog控件以及若干 Label控件以示说明,窗体设计如图1所示。接着输入下面的源代码,编译通过就可以使用了。主要的地方我已经加了注释。在编译之前,请确定你安装了微软拼音输入法。

程序代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls, Buttons, IMM;

type

TForm1 = class(TForm)

OpenDialog1: TOpenDialog;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

Edit2: TEdit;

Edit1: TEdit;

Label5: TLabel;

Label1: TLabel;

BitBtn1: TBitBtn;

procedure BitBtn1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure BitBtn3Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

public

iHandleCount: integer;

pList : array[1..20] of HKL;

szImeName : array[0..254] of char;

II : integer;

end;

const

pych: array[1..6,1..5] of string[2]=

(('ā', 'á','ǎ','à','a'),('ō', 'ó','ǒ','ò','o'),

('ē', 'é','ě','è','e'),('ī', 'í','ǐ','ì','i'),

('ū', 'ú','ǔ','ù','u'),('ǖ', 'ǘ','ǚ','ǜ','ü'));

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

var

i: integer;

begin

II := 0;

//retrieves the keyboard layout handles corresponding to the current set of input locales in the system.

iHandleCount := GetKeyboardLayoutList(20, pList);

for i := 1 to iHandleCount do

begin

if ImmEscape(pList[i], 0, IME_ESC_IME_NAME, @szImeName) > 0 then

if szImeName='微软拼音输入法' then

begin

StdCtrls, ExtCtrls, Buttons, IMM;

type

TForm1 = class(TForm)

OpenDialog1: TOpenDialog;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

Edit2: TEdit;

Edit1: TEdit;

Label5: TLabel;

Label1: TLabel;

BitBtn1: TBitBtn;

procedure BitBtn1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure BitBtn3Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

public

iHandleCount: integer;

pList : array[1..20] of HKL;

szImeName : array[0..254] of char;

II : integer;

end;

const

pych: array[1..6,1..5] of string[2]=

(('ā', 'á','ǎ','à','a'),('ō', 'ó','ǒ','ò','o'),

('ē', 'é','ě','è','e'),('ī', 'í','ǐ','ì','i'),

('ū', 'ú','ǔ','ù','u'),('ǖ', 'ǘ','ǚ','ǜ','ü'));

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

var

i: integer;

begin

II := 0;

//retrieves the keyboard layout handles corresponding to the current set of input locales in the system.

iHandleCount := GetKeyboardLayoutList(20, pList);

for i := 1 to iHandleCount do

begin

if ImmEscape(pList[i], 0, IME_ESC_IME_NAME, @szImeName) > 0 then

if szImeName='微软拼音输入法' then

begin

ii := i;

exit;

end;

end;

ShowMessage('请你安装"微软拼音输入法"!');

end;

// 选择需要标注拼音的文件:

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

OpenDialog1.Title := '选择需要转换的文件';

if OpenDialog1.Execute then

Edit1.Text := OpenDialog1.FileName;

Edit2.Text := ChangeFileExt(OpenDialog1.FileName, '.py');

end;

// 拼音文件保存到

procedure TForm1.BitBtn3Click(Sender: TObject);

begin

OpenDialog1.Title := '转换到:';

if OpenDialog1.Execute then

Edit2.Text := OpenDialog1.FileName;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

var

f1 ,f2 :textfile;

ch1,ch2,ch11 :Char;

ch2Str :string;

j ,alr , tmp :integer;

py : array[1..6] of integer;

function QueryCompStr(hKB: HKL; const sChinese: AnsiString): string;

var

dwGCL: DWORD;

szBuffer: array[0..254] of char;

iMaxKey, iStart, i: integer;

begin

Result := '';

iMaxKey := ImmEscape(hKB, 0, IME_ESC_MAX_KEY, nil);

if iMaxKey <= 0 then exit;

// 看看这个输入法是否支持Reverse Conversion功能,同时, 侦测需要多大的空间容纳取得的信息

dwGCL := ImmGetConversionList(hKB, 0, pchar(sChinese),nil, 0, GCL_REVERSECONVERSION);

if dwGCL <= 0 then Exit; // 该输入法不支持Reverse Conversion功能

// 取得组字字根信息, dwGCL的值必须用上次呼叫ImmGetConversionList得到的返回值作为参数

dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer, dwGCL,GCL_REVERSECONVERSION);

if dwGCL > 0 then

begin

iStart := byte(szBuffer[24]);

for i := iStart to iStart + iMaxKey * 2 do

AppendStr(Result, szBuffer[i]);

end;

end;

begin

tmp:=0;

if not FileExists(Edit1.text)then

begin

ShowMessage('请你选定一个文件或你'#13#10'选择的文件不存在!');

exit;

end;

AssignFile(F1, edit1.Text);

Reset(F1);

AssignFile(F2, edit2.Text);

Rewrite(F2);

while not Eof(F1) do

begin

alr:=0;

Read(F1, Ch1);

if not IsDBCSLeadByte(byte(ch1)) then

begin

Write(F2, Ch1);

continue;

end; //if

Read(F1, Ch11);

ch2str:= QueryCompStr(pList[ii], ch1+ch11);

if (ch2str[1]=#0)then

begin

Write(F2, Ch1);

Write(F2, Ch11);

continue;

end;

for J:=1 to 8 do

begin

if (ch2str[j]'0') then

tmp:=strtoint(ch2str[j]);

end;

for j:=1 to 6 do

py[j]:=0;

//以下是判断加拼音的位置,注意ui和iu加声调的方式

for j:=8 downto 1 do

begin

if ch2str[j]='a' then py[1]:=1;

if ch2str[j]='o' then py[2]:=1;

if ch2str[j]='e' then py[3]:=1;

if (ch2str[j]='i') and (py[5]<>1)then py[4]:=1;

if (ch2str[j]='u') and (py[4]<>1) then py[5]:=1;

if ch2str[j]='ü' then py[6]:=1;

end;

for J:=1 to 8 do

begin

end; //if

if (ch2='o') and (alr=0) and (py[1]<>1) then

begin

alr:=1;

Write(F2, pych[2][tmp]);

continue;

end;

if (ch2='e') then

begin

alr:=1; Write(F2, pych[3][tmp]);

continue;

end;

if (ch2='i')and (alr=0) and (py[1]<>1) and (py[2]<>1) and (py[3]<>1) and (py[4]=1) then

begin

alr:=1;

Write(F2, pych[4][tmp]);

continue;

end;

if (ch2='u')and (alr=0) and (py[1]<>1) and (py[2]<>1) and (py[3]<>1) and (py[5]=1) then

begin

alr:=1;

Write(F2, pych[5][tmp]);

continue;

end;

if (ch2='ü')and (alr=0)and (py[3]<>1) then

begin

alr:=1;

Write(F2, pych[6][tmp]);

continue;

end;

Write(F2, Ch2);

end; //for

write(f2,' ');

end; //while

CloseFile(F2);

CloseFile(F1);

ShowMessage('转换完毕!');

end;

end.

程序中判断加拼音的位置的方法有些笨拙,所幸还能用。如果你写出了更有效率的代码,希望能和大家一起分享。有一个要注意的地方,程序还不能处理多音字。另外,你可以在程序中添加进度条,以了解程序的进度。程序在Delphi6 + Windows98下调试通过。

欢迎大家阅读《用Delphi 6编程实现自动标注汉语拼音_Delphi》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码

微信 赏一包辣条吧~

支付宝 赏一听可乐吧~

delphi读音_用Delphi 6编程实现自动标注汉语拼音_Delphi相关推荐

  1. delphi语音_在Delphi中使用Windows文本语音转换

    In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basi ...

  2. vs代码补全的快捷键_一款Python编程的自动补全插件神器——kite

    最近发现了一款Python编程的插件神器--kite,相见恨晚啊,它是一款基于AI技术的自动补全功能插件,可用于大部分的Python编程环境,如PyCharm.VSCode.Vim.Sublime T ...

  3. 蓝湖怎么切图标注_如何用蓝湖做自动标注 ?

    目录: 一.下载安装蓝湖插件 1.用 Sketch 做的设计图 2.用 Photoshop 做的设计图 二.一键上传设计图 1.用 Sketch 做的设计图 2.用 Photoshop 做的设计图 三 ...

  4. 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...

    学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...

  5. python交互式程序设计导论答案第五周_学堂在线_计算机科学与Python编程导论_章节测试答案...

    学堂在线_计算机科学与Python编程导论_章节测试答案 更多相关问题 素描的三种表现形式是:(). 运行下列程序:Private Sub form_Click()For i = 1 To 2x = ...

  6. delphi android闪退,delphi 运行后闪退

    我的delphi编完一段程序之后按F9可以运行,但是关掉并保存Delphi之后再打开Delphi然后打开之前那个编辑的程序按F9就直接闪退了. 程序如下: unit Unit1; interface ...

  7. 计算机编程导论python程序设计答案-学堂云_计算机科学与Python编程导论_作业课后答案...

    学堂云_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 保本基金参与股指期货交易,应当根据风险管理的原则,以套期保值为目的.() 基金经理主要依据股票投资价值报告来决定实际的投资 ...

  8. delphi XE应用Restful时Rest组件的delphi XE ContentType即delphi XE mime type怎样获取和表达

    delphi XE应用Restful时Rest组件的delphi XE ContentType即delphi XE mime type怎样获取和表达 一.uses REST.Types; //var ...

  9. 华兴数控g71外圆循环编程_数控车床加工编程典型实例分析(西门子802S数控系统)...

    这是一篇带有教学色彩的习作,文章对数控编程的方式和步骤进行了简明的阐述,并针对一个典型零件的数控车削加工给出了一套程序.程序是以西门子802S数控系统为例编写的. 数控机床是一种技术密集度及自动化程度 ...

  10. linux自动键入密码_通过键入条件进行Excel自动筛选

    linux自动键入密码 Someone emailed me for help with an Excel AutoFilter last week. He wanted to type the cr ...

最新文章

  1. Python系列教程之学生信息管理系统
  2. request和response的setCharacterEncoding()方法
  3. (仿头条APP项目)2.主界面按钮切换Fragment页面
  4. 如何创建MFC模式对话框与非模式对话框
  5. 为什么我们总是「习惯性辩解」?
  6. 卓语言对泛型类的使用
  7. 软考信息安全必备考点
  8. 【渝粤教育】国家开放大学2018年春季 0408-21T管理学基础 参考试题
  9. colorui 使用iconfont图标
  10. Unity粒子特效系列-闪星星的宝箱
  11. 卡尔曼滤波原理及matlab仿真
  12. Vulkan Samples 阅读 -- Basics(四): Texture Arrays Cube Map Textures 3D Textures
  13. Master HA彻底解密
  14. Vue3通过npm或者yarn启动后,显示“Network: use --host to expose”,无法访问
  15. 强大的虚拟音频器:Loopback for Mac
  16. 《基础知识——代码相关》
  17. 【Lombok】@Log | 如何优雅的进行日志记录
  18. gorm增删查改json_go基于echo、gorm实现增删改查,从请求到落库
  19. Nancy和ASP.NET MVC的简单对比
  20. http://www.dewen.net.cn/q/15807/java byte 疑问

热门文章

  1. js获取ip地址、浏览器信息
  2. java txt 分段读取_Java 读取TXT文件的多种方式
  3. 图像处理之图像复原[逆滤波、维纳滤波、约束最小二乘法、Lucy-Richardson和盲解卷积复原]
  4. 应用架构、业务架构、技术架构和业务流程图详解
  5. matlab高斯窗函数,Matlab的窗函数,矩形窗,三角窗,汉明窗,汉宁窗,布莱克曼窗
  6. html图片自适应屏幕大小
  7. Caffe安装 (OPENCV4 Cuda10.2 Xavier)
  8. 【STM32】基于STM32F407实现串口通信
  9. 北斗高精度卫星接收机的分类
  10. VS2017离线下载、安装教程