Текущий архив: 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