请问一个音标方面的问题?
如何根据中文的一个字或词组得到每一个汉字的首音标,
比如: 中国(ZG), 用户信息(YHXX)
问题点数:60、回复次数:8Top
1 楼grail_(grail_)回复于 2003-02-04 01:38:44 得分 4
建字库吧!
Top
2 楼EpopeeLei(午夜狂编)回复于 2003-02-04 01:52:29 得分 20
获取指定汉字的拼音索引字母,如:“汉”的索引字母是“H”}
function GetPYIndexChar(hzchar: string): char;
begin
case WORD(hzchar[1]) shl 8 + WORD(hzchar[2]) of
$B0A1..$B0C4: result := 'A';
$B0C5..$B2C0: result := 'B';
$B2C1..$B4ED: result := 'C';
$B4EE..$B6E9: result := 'D';
$B6EA..$B7A1: result := 'E';
$B7A2..$B8C0: result := 'F';
$B8C1..$B9FD: result := 'G';
$B9FE..$BBF6: result := 'H';
$BBF7..$BFA5: result := 'J';
$BFA6..$C0AB: result := 'K';
$C0AC..$C2E7: result := 'L';
$C2E8..$C4C2: result := 'M';
$C4C3..$C5B5: result := 'N';
$C5B6..$C5BD: result := 'O';
$C5BE..$C6D9: result := 'P';
$C6DA..$C8BA: result := 'Q';
$C8BB..$C8F5: result := 'R';
$C8F6..$CBF9: result := 'S';
$CBFA..$CDD9: result := 'T';
$CDDA..$CEF3: result := 'W';
$CEF4..$D188: result := 'X';
$D1B9..$D4D0: result := 'Y';
$D4D1..$D7F9: result := 'Z';
else
result := char(0);
end;
end;Top
3 楼cg1120(代码最优化-§惟坚韧者始能遂其志§)回复于 2003-02-08 20:52:30 得分 30
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMainForm = class(TForm)
ChineseEdt: TEdit;
PYEdt: TEdit;
btnConvert: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure btnConvertClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
// 获取指定汉字的拼音索引字母,如:“汉”的索引字母是“H”
function GetPYIndexChar( hzchar:string):char;
begin
case WORD(hzchar[1]) shl 8 + WORD(hzchar[2]) of
$B0A1..$B0C4 : result := 'A';
$B0C5..$B2C0 : result := 'B';
$B2C1..$B4ED : result := 'C';
$B4EE..$B6E9 : result := 'D';
$B6EA..$B7A1 : result := 'E';
$B7A2..$B8C0 : result := 'F';
$B8C1..$B9FD : result := 'G';
$B9FE..$BBF6 : result := 'H';
$BBF7..$BFA5 : result := 'J';
$BFA6..$C0AB : result := 'K';
$C0AC..$C2E7 : result := 'L';
$C2E8..$C4C2 : result := 'M';
$C4C3..$C5B5 : result := 'N';
$C5B6..$C5BD : result := 'O';
$C5BE..$C6D9 : result := 'P';
$C6DA..$C8BA : result := 'Q';
$C8BB..$C8F5 : result := 'R';
$C8F6..$CBF9 : result := 'S';
$CBFA..$CDD9 : result := 'T';
$CDDA..$CEF3 : result := 'W';
$CEF4..$D188 : result := 'X';
$D1B9..$D4D0 : result := 'Y';
$D4D1..$D7F9 : result := 'Z';
else
result := char(32);
end;
end;
procedure TMainForm.btnConvertClick(Sender: TObject);
var
I: Integer;
PY: string;
s: string;
begin
s := '' ;
I := 1;
while I <= Length(ChineseEdt.Text) do
begin
PY := Copy(ChineseEdt.Text, I , 1);
if PY >= Chr(128) then
begin
Inc(I);
PY := PY + Copy(ChineseEdt.Text, I , 1);
s := s + GetPYIndexChar(PY);
end
else
s := s + PY;
Inc(I);
end;
PYEdt.Text := s;
end;
end.
Top
4 楼cg1120(代码最优化-§惟坚韧者始能遂其志§)回复于 2003-02-08 20:52:46 得分 0
unit HzSpell;
interface
uses
Windows, Messages, SysUtils, Classes;
type
THzSpell = class(TComponent)
protected
FHzText: String;
FSpell: String;
FSpellH: String;
procedure SetHzText(const Value: String);
function GetHzSpell: String;
function GetPyHead: String;
public
class function PyOfHz(Hz: String): String;
class function PyHeadOfHz(Hz: String): String;
published
property HzText: String read FHzText write SetHzText;
property HzSpell: String read GetHzSpell;
property PyHead: String read GetPyHead;
end;
{$I HzSpDat2.inc}
procedure Register;
function GetHzPy(HzChar: PChar; Len: Integer): String;
function GetHzPyFull(HzChar: String): String;
function GetHzPyHead(HzChar: PChar; Len: Integer): String;
function GetPyChars(HzChar: String): String;
implementation
procedure Register;
begin
RegisterComponents('System', [THzSpell]);
end;
function GetHzPy(HzChar: PChar; Len: Integer): String;
var
C: Char;
Index: Integer;
begin
Result := '';
if (Len > 1) and (HzChar[0] >= #129) and (HzChar[1] >= #64) then
begin
//是否为 GBK 字符
case HzChar[0] of
#163: // 全角 ASCII
begin
C := Chr(Ord(HzChar[1]) - 128);
if C in ['a'..'z', 'A'..'Z', '0'..'9', '(', ')', '[', ']'] then
Result := C
else
Result := '';
end;
#162: // 罗马数字
begin
if HzChar[1] > #160 then
Result := CharIndex[Ord(HzChar[1]) - 160]
else
Result := '';
end;
#166: // 希腊字母
begin
if HzChar[1] in [#$A1..#$B8] then
Result := CharIndex2[Ord(HzChar[1]) - $A0]
else if HzChar[1] in [#$C1..#$D8] then
Result := CharIndex2[Ord(HzChar[1]) - $C0]
else
Result := '';
end;
else
begin // 获得拼音索引
Index := PyCodeIndex[Ord(HzChar[0]) - 128, Ord(HzChar[1]) - 63];
if Index = 0 then
Result := ''
else
Result := PyMusicCode[Index];
end;
end;
end
else if Len > 0 then
begin
//在 GBK 字符集外, 即半角字符
if HzChar[0] in ['a'..'z', 'A'..'Z', '0'..'9', '(', ')', '[', ']'] then
Result := HzChar[0]
else
Result := '';
end;
end;
function GetHzPyFull(HzChar: String): String;
var
i, len: Integer;
Py: String;
function IsDouByte(C: Char): Boolean;
begin
Result := C >= #129;
end;
begin
Result := '';
i := 1;
while i <= Length(HzChar) do
begin
if IsDouByte(HzChar[i]) and (Length(HzChar) - i > 0) then
len := 2
else
len := 1;
Py := GetHzPy(@HzChar[i], len);
Inc(i, len);
if (Result <> '') and (Py <> '') then
Result := Result + ' ' + Py // + ' '
else
Result := Result + Py;
end;
end;
function GetHzPyHead(HzChar: PChar; Len: Integer): String;
begin
Result := Copy(GetHzPy(HzChar, Len), 1, 1);
end;
function GetPyChars(HzChar: String): String;
var
i, len: Integer;
Py: String;
function IsDouByte(C: Char): Boolean;
begin
Result := C >= #129;
end;
begin
Result := '';
i := 1;
while i <= Length(HzChar) do
begin
if IsDouByte(HzChar[i]) and (Length(HzChar) - i > 0) then
len := 2
else
len := 1;
Py := GetHzPyHead(@HzChar[i], len);
Inc(i, len);
Result := Result + Py;
end;
end;
{ THzSpell }
function THzSpell.GetHzSpell: String;
begin
if FSpell = '' then
begin
Result := GetHzPyFull(FHzText);
FSpell := Result;
end
else Result := FSpell;
end;
function THzSpell.GetPyHead: String;
begin
if FSpellH = '' then
begin
Result := GetPyChars(FHzText);
FSpellH := Result;
end
else Result := FSpellH;
end;
class function THzSpell.PyHeadOfHz(Hz: String): String;
begin
Result := GetPyChars(Hz);
end;
class function THzSpell.PyOfHz(Hz: String): String;
begin
Result := GetHzPyFull(Hz);
end;
procedure THzSpell.SetHzText(const Value: String);
begin
FHzText := Value;
FSpell := '';
FSpellH := '';
end;
end.Top
5 楼hedong(电脑动能)回复于 2003-02-09 12:56:40 得分 0
请解释一下:
case WORD(hzchar[1]) shl 8 + WORD(hzchar[2]) of
//hzchar是什么意思;
//WORD(hzchar[1]) shl 8 是什么意思?Top
6 楼___iGoogle___(出来混的是生是死要由自己来决定)回复于 2003-02-09 21:01:55 得分 2
好像不适用 UNICODETop
7 楼kaolaxiong(考拉熊)回复于 2003-02-14 13:23:38 得分 2
UPTop
8 楼hansion3406(阿木㊣拖鞋男)回复于 2003-02-15 17:35:37 得分 2
呼...Top




