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;}