Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MSDOS or Windows [D7, WinXP]


nikola233 ©   (2006-10-16 15:46:00) 

Привет всем! Подскажите как определить кодировку таблицы (Paradox) MSDOS или Windows.


Mirage   (2006-10-27 15:30:00) [1]

>[6] vigo_ 27-Oct-2006, 15:22
>А в функции function DetectCodePage (const buf;
>bufSize: Integer; maxBufUse: Integer = -1): Integer;
>bufSize - это length(buf)?
ага. чем он больше, тем лучше. но маньячить не надо. нескольких килобайт (десятков килобайт %-) вполне хватает. %-)


vigo_   (2006-10-27 15:22:00) [2]

2Ketmar:

А в функции function DetectCodePage (const buf; bufSize: Integer; maxBufUse: Integer = -1): Integer;
bufSize - это length(buf)?


Ketmar   (2006-10-20 17:34:00) [3]

ходить на мой сайт. качать miscU.7z. брать модуль cpDetectU.pas. определение CP866/win-1251/kio8-r и перекодировка их всех в 1251.


Anatoly Podgoretsky   (2006-10-20 16:48:00) [4]

ДОС от Виндоус для русских кодировок определяется элементарнейше, поскольку символы в разных диапазонах.


Негр   (2006-10-20 16:30:00) [5]

Вроде бы хороший код, но как его использовать интересно ?


from kz   (2006-10-20 16:21:00) [6]

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;


LBP   (2006-10-20 16:12:00) [7]

определить кодировку. Это сложно.
Обычно для этих целей создается база с
наиболее часто употребляемыми словами и потом текст сравнивается
на наличие таких слов.
Например, предлог " как"  в кодировке koi-8 выглядит
" ЛБЛ" . Понятно, что такое словосочетание
вряд ли будет в нормальном тексте (хотя и возможно),
отсюда можно заключить, что это текст в кодировке koi-8.


Наверх

Титульная страница Поиск, карта сайта Написать письмо