Компоненты для работы с DBF

Mandarin
Дата: 09.06.2009 10:10:52
Всем привет!
Народ подскажите как правельно решить задачу...
входящая информация:
1. есть программа которая обрабатывает DBF файлы
2. есть DBF файлы с разными кодирровками и разными уровнями

для того чтобы прочитать информацию в DBF мне нужно знать в какой он кодировке чтоб правельно установить кодировку в своей программе...

вопрос: есть ли такие компоненты которые сами понимают кодировку в файле и сразу без доаполнительных настроек открывают DBF в правельной кодировке ?
zirra
Дата: 09.06.2009 10:15:20

On Tue, 09 Jun 2009 11:10:52 +0400, Mandarin <nospam@sql.ru> wrote:

> Автор: Mandarin
> Народ подскажите как правельно решить задачу...

Правильно - это писАть "правИльно"...

> входящая информация:
> 1. есть программа которая обрабатывает DBF файлы
> 2. есть DBF файлы с разными кодирровками и разными уровнями

+ попробуй так:
//  TCodePageDetector  //
type
   TKeyMap = (kmNone, kmAscii, kmAnsi, kmKoi8r);
   TCodePageDetector = class
   public
     Koi, KoiA, Win, WinA, Win2: LongInt;
     constructor Create;
     destructor Destroy;
     procedure CheckString(const S: string);
     function DetectedCodePage: TKeyMap;
   end;

constructor TCodePageDetector.Create;
begin
   Koi := 0;
   KoiA := 0;
   Win := 0;
   WinA := 0;
   Win2 := 0;
end;

destructor TCodePageDetector.Destroy;
begin
   //
end;

const
   WinSetA = ['а', 'е', 'и', 'о', 'у']; { [' ','_','Ё','R','г'] }
   KoiSetA = ['Б', 'Е', 'Й', 'П', 'Х'];

procedure TCodePageDetector.CheckString(const S: string);
var
   J, I: Integer;
   C: Char;
begin
   J := Length(S);
   I := 1;
   while I < J do begin
     C := S[I];
     Inc(I);
     if C >= #$C0 then
       if C <= #$DF then begin
         Inc(Koi);
         if C in KoiSetA then Inc(KoiA);
       end
       else begin
         Inc(Win);
         if C in WinSetA then Inc(WinA);
         if C >= #$F0 then Inc(Win2);
       end;
   end;
end;

function TCodePageDetector.DetectedCodePage: TKeyMap;
begin
   DetectedCodePage := kmAscii;
   if (Koi <> 0) and (KoiA <> 0) and (Win <> 0) and
     (Win >= Koi / 500) and (Win <= Koi / 5) and
     (KoiA >= Koi / 5) then
     DetectedCodePage := kmKoi8r
   else if (Win <> 0) and (WinA <> 0) and (Koi <> 0) and
     (Koi >= Win / 500) and (Koi <= Win / 5) and
     (WinA >= Win / 5) and (Win2 >= Win / 5) then
     DetectedCodePage := kmAnsi;
end;

//  TCodePageDetector  //

Под 866 переделать тоже не сильно сложно...

Posted via ActualForum NNTP Server 1.4

Mandarin
Дата: 09.06.2009 10:44:07
спасибо за подсказки :) и по граматике тоже :)
Альт
Дата: 09.06.2009 18:45:41
zirra, +1
Частотность - самое радикальное средство
zirra
Дата: 10.06.2009 09:33:41

On Tue, 09 Jun 2009 19:45:41 +0400, Альт <nospam@sql.ru> wrote:

> Автор: Альт
> Частотность - самое радикальное средство

Однако всё равно замечу: не радикальное!.. ;)
Иногда таки лажает... Но эти случаи я (за лет 5 использования этого
кода) могу на пальцах пересчитать... %)

Posted via ActualForum NNTP Server 1.4

LSV
Дата: 10.06.2009 10:14:27
Компоненты Halcyon, Apollo (заметно лучше первого)
Альт
Дата: 10.06.2009 11:51:14
zirra, а все потому, что надо еще учитывать и саму частотность )
т.к. частота "у" в три раза меньше частоты "о"... да и начинается таблица с: о а е и
а это дело твой алгоритм не учитывает )
zirra
Дата: 10.06.2009 17:10:29

On Wed, 10 Jun 2009 12:51:14 +0400, Альт <nospam@sql.ru> wrote:

> Автор: Альт
> а это дело твой алгоритм не учитывает )

Мопед не мой!..
Картинка с другого сайта.

Posted via ActualForum NNTP Server 1.4