如何针对具体的汉字列出其(支持UNICODE)的拼音?给出程序提示给全分:(30分)

  • 主题发起人 主题发起人 waderlym
  • 开始时间 开始时间
W

waderlym

Unregistered / Unconfirmed
GUEST, unregistred user!
unit IMCode;

(*
简化版拼音反查单元=====================
修改于 Trueway(TM) LiQunwei
修改者 2ccc.com ZhongWan
修改内容 去掉外挂字典,简化代码
*)

interface

function MakeSpellCode(stText: string
iMode, iCount: Integer): string;
{ iMode 二进制功能位说明
X X X X X X X X X X X X X X X X
3 2 1
1: 0 - 只取各个汉字声母的第一个字母
1 - 全取
2: 0 - 遇到不能翻译的字符不翻译
1 - 翻译成 '?' (本选项目针对全角字符)
3: 0 - 生成的串不包括非数字, 字母的其他字符
1 - 包括
(控制全角的要输出非数字, 字母字符的
半角的非数字, 字母字符)
}

function GetSpellCode(szText: PChar
iMode, iCount: Integer): PChar
stdcall;

implementation

uses
SysUtils;

type
{ 拼音代码表 }
TPYCode = record
PYCode: string[6];
end;
TFPYCodes = array [1..126, 1..191] of TPYCode;

const
PYMUSICCOUNT = 405;
PyMusicCode: array [1..PYMUSICCOUNT] of string[6] = { 汉字基本发音表 } (
太多行,Help Workshop生成出错,删除n行(Sueprmay注)

CharIndex: array [1..94] of string[2] = ( { 罗马数字 }
'1','2','3','4','5','6','7','8','9','10','','','','','','',
'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20',
'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20',
'1','2','3','4','5','6','7','8','9','10','','',
'1','2','3','4','5','6','7','8','9','10','','',
'1','2','3','4','5','6','7','8','9','10','11','12','',''
);

CharIndex2: array [1..24] of string[2] = ( { 希腊字母 }
'a','b','g','d','e','z','e','th','i','k','l','m','n','x','o','p','r',
's','t','u','ph','kh','ps','o'
);

function MakeSpellCode(stText: string
iMode, iCount: Integer): string;
var
i, Index: integer;
APy: string;
fFlag1, fFlag2, fFlag3: Boolean;
begin
fFlag1 := (iMode and $0001) = 1;
fFlag2 := (iMode and $0002) = 2;
fFlag3 := (iMode and $0004) = 4;
Result := '';
if iMode < 0 then Exit;
i := 1;

while (i <= Length(stText)) do
begin
if (Ord(stText) >= 129) and (Ord(stText[i + 1]) >= 64) then
begin
// 是否为 GBK 字符
case Ord(stText) of
163: // 全角 ASCII
begin
APy := Chr(Ord(stText[i + 1]) - 128);
// 控制不能输出非数字, 字母的字符
if not fFlag3 and not (APy[1] in ['a'..'z', 'A'..'Z', '0'..'9']) then
APy := '';
end;
162: // 罗马数字
if Ord(stText[i + 1]) > 160 then
APy := CharIndex[Ord(stText[i + 1]) - 160] else
// 在罗马数字区, 不能翻译的字符非罗马数字
if fFlag2 then APy := '?' else APy := '';
166: // 希腊字母
if Ord(stText[i + 1]) in [$A1..$B8] then
APy := UpperCase(CharIndex2[Ord(stText[i + 1]) - $A0])
else if Ord(stText[i + 1]) in [$C1..$D8] then
APy := UpperCase(CharIndex2[Ord(stText[i + 1]) - $C0]);
else // 一般汉字
begin
// 获得拼音索引
Index := PyCodeIndex[Ord(stText) - 128, Ord(stText[i + 1]) - 63];
if Index = 0 then // 无此汉字, 不能翻译的字符, GBK 保留
if fFlag2 then APy := '?' else APy := ''
else if not fFlag1 then // iFlag1 = False, 是单拼音
APy := Copy(Uppercase(PyMusicCode[Index]), 1, 1) else
APy := Copy(Uppercase(PyMusicCode[Index]), 1, 6);
end;
end;
Result := Result + APy;
Inc(i, 2);
end else
begin // 在 GBK 字符集外, 即半角字符
if fFlag3 or (stText in ['a'..'z', 'A'..'Z', '0'..'9']) then
Result := Result + UpperCase(stText);
Inc(i);
end;
end;
Result := Copy(Result, 1, iCount);
end;

function StrPch(const stPas: string): PChar;
// Pascal -> PChar
// 直接使用 PChar 转化有时会转化出错
begin
GetMem(Result, Length(stPas) + 1);
StrPCopy(Result, stPas);
end;

function GetSpellCode(szText: PChar
iMode, iCount: Integer): PChar;
// Call MakeSpellCode
begin
Result := StrPch(MakeSpellCode(String(szText), iMode, iCount));
end;

end.



{procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=MakeSpellCode(Edit1.Text, 1, 255);
Edit3.Text:=MakeSpellCode(Edit1.Text, 2, 255);
Edit4.Text:=MakeSpellCode(Edit1.Text, 4, 255);
end;}
 
做拼音查询程序的难点不在编程,而在读音资料的收集。说说你要多少字的拼音吧--支持Unicode,难道你想要Unicode里面全部七万多个汉字的所有拼音?
 
我只需要支持Unicode的 全部汉字的拼音首写字母(每一个汉字的拼音的第一个字母,比如爱就对应A)如此等等至于如何弄我知道网上的东西下了的,可是程序都在遇到是GBK类型的字时显出错误,比如GB2312里面的字和对应的繁体字读音都不相同.如何有效的做这个程序呢,请个位不要把网上的程序COPY因为我在做之前有过检索,分不够我再开
谢谢 大大指导
 
不会吧?你是在网上哪里下载的东西,怎么可能简体字和对应的繁体字的读音不相同?如果连这么低级的错误都会有的话,那你下的这个东西不要也罢了。
推荐你看看北大中文论坛上的中文信息处理版的一篇帖子,它提供了一个Unicode汉字的拼音对照表下载,这个表就比较可靠点了:
http://www.pkucn.com/viewthread.php?tid=159264&extra=&highlight=%C6%B4%D2%F4&page=1
 
我晕 楼上给的是字音表 和字码不对应的 我倒 我还不如手工去自己打 那位大大再给个提示或者方案.
 
我才晕呢[:(]真是好心没有好报啊,什么叫“字音表 和字码不对应的”?!自己认真看过没有呀?网上下载的东西,其格式一般都是发布者根据自己的研究需要而制定的,很少有说另外一个人拿到别人的资料马上就可以不加修改地应用到自己的项目里面去的。原始资料就在那里,怎么整理是你自己的事,如果你连自己把资料整理成需要的格式的能耐都没有,那下面的事不做也罢。我敢说你就是在搜索引擎上翻到一万多条结果也未必找得到比那篇帖子里面提供的要好的汉字拼音表,还说什么“我还不如手工去自己打”--老大,你仔细看看那张表吧,那可是包含了3万多个汉字的拼音数据的最完整的汉字普通话读音数据!自己打?估计打不到3千个就得吐血了~我还真后悔真么轻易就把那么好的资料推荐在这里了。
 
我晕 我连你COPY上去的原程序都有 不就是在盒子上下的吗 ?我不知道要改吗?问题是我全需要支持UNCODE的 你看你COPY的函数都支持吗?我倒 ,算我语气不对向你道歉.[8D]
 
我给你提供全面的汉字拼音对照表,自己加工下就好了 ,没有谁能做到你的要求的 .[:D]
 
SparkV jj830104
谢谢 ,
 
后退
顶部