|
|
Àëãîðèòì ðàñïîçíîâàíèÿ êîäèðîâêè íóæåí äëÿ àâòîìàòè÷åñêîãî äåêîäèðîâàíèÿ òåêñòà. Ýòîò àëãîðèòì îñíîâàí íà òîì, ÷òî íåêîòîðûå áóêâû ðóññêîãî àëôàâèòà âñòðå÷àåòñÿ î÷åíü ÷àñòî, à íåêîòîðûå ðåäêî. Ïîñêîëüêó ýòîò ñïîñîá ñòàòèñòè÷åñêèé, òî ëó÷øå âñåãî îí ðàáîòàåò ñ áîëüøèìè òåêñòàìè.type
TCode = (win, koi, iso, dos);
const
CodeStrings: array [TCode] of String = ('win','koi','iso','dos');
procedure TForm1.Button1Click(Sender: TObject);
var
str: array [TCode] of string;
norm: array ['À'..'ÿ'] of single;
code1, code2: TCode;
min1, min2: TCode;
count: array [char] of integer;
d, min: single;
s, so: string;
chars: array [char] of char;
c: char;
i: integer;
begin
so := Memo1.Text;
norm['À'] := 0.001;
norm['Á'] := 0;
norm['Â'] := 0.002;
norm['Ã'] := 0;
norm['Ä'] := 0.001;
norm['Å'] := 0.001;
norm['Æ'] := 0;
norm['Ç'] := 0;
norm['È'] := 0.001;
norm['É'] := 0;
norm['Ê'] := 0.001;
norm['Ë'] := 0;
norm['Ì'] := 0.001;
norm['Í'] := 0.001;
norm['Î'] := 0.001;
norm['Ï'] := 0.002;
norm['Ð'] := 0.002;
norm['Ñ'] := 0.001;
norm['Ò'] := 0.001;
norm['Ó'] := 0;
norm['Ô'] := 0;
norm['Õ'] := 0;
norm['Ö'] := 0;
norm['×'] := 0.001;
norm['Ø'] := 0.001;
norm['Ù'] := 0;
norm['Ú'] := 0;
norm['Û'] := 0;
norm['Ü'] := 0;
norm['Ý'] := 0.001;
norm['Þ'] := 0;
norm['ß'] := 0;
norm['à'] := 0.057;
norm['á'] := 0.01;
norm['â'] := 0.031;
norm['ã'] := 0.011;
norm['ä'] := 0.021;
norm['å'] := 0.067;
norm['æ'] := 0.007;
norm['ç'] := 0.013;
norm['è'] := 0.052;
norm['é'] := 0.011;
norm['ê'] := 0.023;
norm['ë'] := 0.03;
norm['ì'] := 0.024;
norm['í'] := 0.043;
norm['î'] := 0.075;
norm['ï'] := 0.026;
norm['ð'] := 0.038;
norm['ñ'] := 0.034;
norm['ò'] := 0.046;
norm['ó'] := 0.016;
norm['ô'] := 0.001;
norm['õ'] := 0.006;
norm['ö'] := 0.002;
norm['÷'] := 0.011;
norm['ø'] := 0.004;
norm['ù'] := 0.004;
norm['ú'] := 0;
norm['û'] := 0.012;
norm['ü'] := 0.012;
norm['ý'] := 0.003;
norm['þ'] := 0.005;
norm['ÿ'] := 0.015;
Str[win] := 'ÀàÁáÂâÃãÄäÅ寿ÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖö×÷ØøÙùÚúÛûÜüÝýÞþßÿ';
Str[koi] := 'þÞàÀáÁöÖäÄåÅôÔãÃõÕèÈéÉêÊëËìÌíÍîÎïÏÿßðÐñÑòÒóÓæÆâÂüÜûÛçÇøØýÝùÙ÷×úÚ';
Str[iso] := 'ÐðÑñÒòÓóÔôÕõÖö×÷ØøÙùÚúÛûÜüÝýÞþßÿà¹á¸â�ãƒäºå¾æ³ç¿è¼éšêœëžì�í§î¢ïŸ';
Str[dos] := '€ �¡‚¢ƒ£„¤…¥†¦‡§ˆ¨‰©Šª‹"Œ¬�Ž®�¯�à'á'â“ã”ä•å–æ—ç˜è™éšê›ëœì�ížîŸï';
for c := #0 to #255 do
Chars[c] := c;
min1 := win;
min2 := win;
min := 0;
s := so;
fillchar(count, sizeof(count), 0);
for i := 1 to Length(s) do
inc(count[s[i]]);
for c := 'À' to 'ÿ' do
min := min + sqr(count[c] / Length(s) - norm[c]);
for code1 := low(TCode) to high(TCode) do begin
for code2 := low(TCode) to high(TCode) do begin
if code1 = code2 then continue;
s := so;
for i := 1 to Length(Str[win]) do
Chars[Str[code2][i]] := Str[code1][i];
for i := 1 to Length(s) do
s[i] := Chars[s[i]];
fillchar(count, sizeof(count), 0);
for i := 1 to Length(s) do
inc(count[s[i]]);
d := 0;
for c := 'À' to 'ÿ' do
d := d + sqr(count[c] / Length(s) - norm[c]);
if d < min then begin
min1 := code1;
min2 := code2;
min := d;
end;
end;
end;
s := Memo1.Text;
if min1 <> min2 then begin
for c := #0 to #255 do
Chars[c] := c;
for i := 1 to Length(Str[win]) do
Chars[Str[min2][i]] := Str[min1][i];
for i := 1 to Length(s) do
s[i] := Chars[s[i]];
end;
Form1.Caption := CodeStrings[min2] + ' ' + CodeStrings[min1];
Memo2.Text := s;
end;
ãëàâíàÿ ñòðàíèöà îãëàâëåíèå çàäàòü âîïðîñ email: delphi4all@narod.ru
|