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 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.