Главная страница
    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.5 MB
Время: 0.026 c
10-1083227214
Господин Уэф!
2004-04-29 12:26
2005.02.13
Как выставить окно Excel "всегда наверху"?


4-1103695704
race1
2004-12-22 09:08
2005.02.13
DrawText


1-1107005282
NeedHElp
2005-01-29 16:28
2005.02.13
Kak zapisat zapis v registri 4tob Ad-Wath nevoznikal??


14-1106476885
Шишкин Илья
2005-01-23 13:41
2005.02.13
Печать PDF


3-1105699715
Pavelkq
2005-01-14 13:48
2005.02.13
MS Access + ADO = Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский