Delphi World - ýòî ïðîåêò, ÿâëÿþùèéñÿ ñáîðíèêîì ñòàòåé è ìàëîäîêóìåíòèðîâàííûõ âîçìîæíîñòåé  ïî ïðîãðàììèðîâàíèþ â ñðåäå Delphi. Çäåñü âû íàéä¸òå ðàáîòû ïî ñëåäóþùèì êàòåãîðèÿì: delphi, delfi, borland, bds, äåëüôè, äåëôè, äýëüôè, äýëôè, programming, example, ïðîãðàììèðîâàíèå, èñõîäíûå êîäû, code, èñõîäíèêè, source, sources, ñîðöû, ñîðñû, soft, programs, ïðîãðàììû, and, how, delphiworld, áàçû äàííûõ, ãðàôèêà, èãðû, èíòåðíåò, ñåòè, êîìïîíåíòû, êëàññû, ìóëüòèìåäèà, îñ, æåëåçî, ïðîãðàììà, èíòåðôåéñ, ðàáî÷èé ñòîë, ñèíòàêñèñ, òåõíîëîãèè, ôàéëîâàÿ ñèñòåìà...
Ðàñïîçíàâàíèå êîäèðîâêè. Ïåðåêîäèðîâêà.

Ïðèõîäèò ïðîãðàììèñò ê îêóëèñòó. Òîò åãî óñàæèâàåò íàïðîòèâ òàáëèöû, áåðåò óêàçêó:
- ×èòàéòå!
- "ÁÍÎÏÍß"... Äîêòîð, ó âàñ ÷òî-òî íå òî ñ êîäèðîâêîé!

Àëãîðèòì ðàñïîçíàâàíèÿ êîäèðîâêè íóæåí äëÿ àâòîìàòè÷åñêîãî äåêîäèðîâàíèÿ òåêñòà. Ýòîò àëãîðèòì îñíîâàí íà òîì, ÷òî íåêîòîðûå áóêâû ðóññêîãî àëôàâèòà âñòðå÷àåòñÿ î÷åíü ÷àñòî, à íåêîòîðûå ðåäêî. Ïîñêîëüêó ýòîò ñïîñîá ñòàòèñòè÷åñêèé, òî ëó÷øå âñåãî îí ðàáîòàåò ñ áîëüøèìè òåêñòàìè.


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] := '€ �¡‚¢ƒ£"¤…¥†¦‡§ˆ¨‰©Šª‹"Œ�Ž®�¯�à'á'â"ã"äoå-æ-çè™éšê›ëœì�ížîŸïç?è™éšê›ëœì�ížîŸï';
  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;

Ïðîåêò Delphi World © Âûïóñê 2002 - 2004
Àâòîð ïðîåêòà: ___Nikolay