Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

DOS-кодировка в DBF   Найти похожие ветки 

 
makey22   (2005-01-16 11:52) [0]

Необнодимо записать в DBF-файл информацию в DOS-кодировке
переменная перекодирована  в дос и в текстовый файл выводится правельно, а призаписи в DBF в поле вижу ###########.
DBF-файл создан под досом на FoxPro 2.6


 
Mortal ©   (2005-01-16 12:48) [1]

И еще мой один вопрос.

Как прочитанный текс из DBF в кодировке DOS, перевести в кодировку WIN.

Буду очень благодарен.


 
makey22   (2005-01-16 13:01) [2]

function update_dos(s:string):string;
var c:STRING;
   I:INTEGeR;
   l:byte;
   dd:char;
begin
i:=1;
c:="";
while i< length(s)+1 do
begin
  l:=ord(s[i]);
  inc(i);
  if (l>=128) and (l<=192)then l:=l+64 else
  if (l>=224) and (l<240) then l:=l+16 else
  if l=241 then l:=184 else
  if l=240 then l:=168;
  dd:=chr(l);
  c:=c+dd;
end;
update_dos:=c;
end;

остается только вызвать в нужное аремя


 
Fay ©   (2005-01-16 13:17) [3]

Не знаю, что делает эта функция, но я бы написал её так :
function update_dos(s:string):string;
var
 i : Integer;
begin
 SetLength(Result, Length(s));
 for i := 1 to Length(s) do
   begin
     case s[i] of
       #129..#192 : Result[i] := Char(Ord(s[i]) + 64);
       #224..#239 : Result[i] := Char(Ord(s[i]) + 16);
       #240 : Result[i] := #168;
       #241 : Result[i] := #184;
     else
       Result[i] := s[i];
     end;
   end;
end;


 
Mortal ©   (2005-01-16 13:30) [4]

Спасибо. Буду пробовать


 
Fktrc ©   (2005-01-16 13:59) [5]

//Перекодировать Windows в DOS
function WinToOem (const AnsiStr: string): string;
begin
  try
     SetLength (Result, Length (AnsiStr));
     if Length (Result) > 0 then
     CharToOem(PChar (AnsiStr), PChar (Result));
  except
     MessageBox (Handle,"WinToOem Error",PChar (Caption),MB_OK+mb_IconQuestion);
  end;
end;

//Перекодировать DOS в Windows
function OemToWin (const OemStr: string): string;
begin
  try
     SetLength(Result, Length(OemStr));
     if Length(Result) > 0 then
        OemToChar(PChar(OemStr), PChar(Result));
  except
     MessageBox (Handle,"OemToWin Error",PChar(Caption),MB_OK+mb_IconQuestion);
  end;
end;


 
makey22   (2005-01-16 15:20) [6]

Перекодировать можно и так, но вот при записи в ДБФник который сделан под ДОСом в полях вместо русских букв #########


 
Anatoly Podgoretsky ©   (2005-01-16 15:23) [7]

Просто не надо перекодировать.


 
Mortal ©   (2005-01-16 15:40) [8]

Перекодировать надо.

Без этого никак.


 
Alex_S   (2005-01-16 15:59) [9]

А ты посмотри чем-нибудь в файле на смещении 29 что стоит. Если не 0, то это как раз та болезнь. Надо, чтоб был 0. Не будем теоретизировать, но я ставил туда 0 и все становилось ОК.
Если что, вот моя процедура.

 { -- Проверка на соответствие типу DBaseIII+
     и удаление признака DBaseIV, если есть,
     иначе Windows некорректно воспринимает строки DOS -- }

procedure TableDBaseIII(FName:string);
var
 f:file of byte; b:byte;
 Date0, Hnd:integer; Corr:boolean;
begin
 if not FileExists(FName) then exit;
 Corr:=false;
 Hnd:=FileOpen(FName,2); Date0:=FileGetDate(Hnd); FileClose(Hnd);
 AssignFile(f,FName); reset(f);
 seek(f,29); read(f,b);
 if b<>0 then begin
   b:=0; seek(f,29); write(f,b); Corr:=true;
 end;
 CloseFile(f);
 if Corr then begin
   Hnd:=FileOpen(FName,2); FileSetDate(Hnd,Date0);
   FileClose(Hnd);
 end;
end;

Тут ещё заморочки могут быть лишние, так как я ещё хотел, чтобы не изменялась дата файла.


 
Anatoly Podgoretsky ©   (2005-01-16 16:02) [10]

Mortal ©   (16.01.05 15:40) [8]
Не надо, этим занимается драйвер, в итоге у тебя двойная перекодировка.


 
Alex_S   (2005-01-16 16:04) [11]

А вот после этого уже и применяй то, что тут советуют. Да дело и не в перекодировке, ты это, наверное и без нас уже знаешь. Их везде найти можно, а вот про тот 0 мало кто знает. Причем на одних компьютерах так, а на других все нормально. От Windows ещё что-то зависит или от настроек BDE. С 0 все становится одинаково.


 
Alex_S   (2005-01-16 16:06) [12]

Драйвер путается, когда не 0. Одну версию DBase принимает за другую. Его насильно надо сделать DBaseIII


 
Alex_S   (2005-01-16 16:19) [13]

Вдогонку. Вот посмотрел я сейчас на FoxPro2.6, хоть я его и не перевариваю, но держу. Он создает dbf с 0. Тогда вариант может быть такой. Ты зря перекодируешь свои русские символы из Windows в ДОС. Оно само всё делается. Просто у меня было точно так, я избавился от этого. И было дело в разных Windows и в разных версиях dbf, различающихся именно тем 0. Потому что присылали файлы из разных мест. Стало легче, когда я насильно всем файлам ставил 0 в 29 позиции (начиная с 0), потом смотрел как оно перекодируется с ДОС в Windows и решал стоит его перекодировать или всё само происходит без твоего вмешательства.
В общем, если всё получится, то ответь здесь, где жа собака порылась и кто из нас был прав.


 
makey22   (2005-01-16 17:50) [14]

Alex_S врезал твой код в прогу, заработало.
Единственно, что приходится делать это перекодировать

var st:string; st1:PChar
begin
st1:=PChar(st);
CharToOem(st1,st1);

а далее спокойно пишется в ДБФник, как надо.
без перекодировки были иероглифы
Но это уже мелочи. Огромное СПАСИБО за науку, а то пропарился сегодня целый день.


 
Anatoly Podgoretsky ©   (2005-01-16 18:39) [15]

Это вообще то не наука, а вредительств, он тебе сменил язык таблицы на 437


 
makey22   (2005-01-16 18:47) [16]

Да ради бога. Если все работает как надо и файлы везде читаются как нужно, то хоть на китайскую грамоту.
А если есть, что сказать по существу то с удовольствием послушаем


 
Anatoly Podgoretsky ©   (2005-01-16 19:36) [17]

Это и есть по существу и не надо про везде. Кроме того код хакерский, для этого существуют штатные средства, вот когда порушишь что ни будь этим кодом, тогда и вспомнишь это.


 
Anatoly Podgoretsky ©   (2005-01-16 19:37) [18]

Сообственно это твоя система - имеешь полное право поганить ее как хочешь.


 
makey22   (2005-01-17 06:15) [19]

Alex_S
Я тут разобрался с 29 байтом в ДБФке. При занесении туда 0 ты заставляешь драйвер игнорировать языковую привязку и он пишет в файл в той кодировке, в которой ты пошлешь один в один.
Если же в этот байт записать 0*26(38) то при записи драйвер сам перекодирует твой текст в 866 страницу.

А для кодировки в 437 странице в 29 байт нужно записать 1



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
4-1103891912
arick
2004-12-24 15:38
2005.02.13
Аттач к письму!!!


14-1106311908
мазербо)
2005-01-21 15:51
2005.02.13
есть у кого Hellsing?


1-1107260777
NightStranger
2005-02-01 15:26
2005.02.13
Как создать ЕХЕ


4-1104168822
miek
2004-12-27 20:33
2005.02.13
Hook на клавиатуру


4-1103568134
WandR
2004-12-20 21:42
2005.02.13
Загрузчик ехе