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

Вниз

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

 
Vovik   (2006-01-14 21:05) [0]

Подскажите как программно сделать так чтобы сохранять текстовый файл в той кодировке каторая нужна (например DOS, Windows, KOI8, т.д)


 
Vit@ly ©   (2006-01-14 21:11) [1]

Файл обычно сохраняется "as is", а вот "кто" и "как" его будет читать - другой вопрос


 
palva ©   (2006-01-14 21:18) [2]

> как программно сделать так чтобы сохранять текстовый файл
Вы хотите из программы управлять каким-нибудь текстовым редактором? Или ваша программа сама должна сохранить некоторый текст в файл?


 
з. танька   (2006-01-14 22:05) [3]

используй таблицы перекодировки... вот примерчик... перекодируем файл.


type
 TDecodePage = array[0..127] of Byte;

const

 KOI_TO_WIN: TDecodePage = (
   $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
   $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
   $A0, $A1, $A2, $B8, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF,
   $B0, $B1, $B2, $A8, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF,
   $FE, $E0, $E1, $F6, $E4, $E5, $F4, $E3, $F5, $E8, $E9, $EA, $EB, $EC, $ED, $EE,
   $EF, $FF, $F0, $F1, $F2, $F3, $E6, $E2, $FC, $FB, $E7, $F8, $FD, $F9, $F7, $FA,
   $DE, $C0, $C1, $D6, $C4, $C5, $D4, $C3, $D5, $C8, $C9, $CA, $CB, $CC, $CD, $CE,
   $CF, $DF, $D0, $D1, $D2, $D3, $C6, $C2, $DC, $DB, $C7, $D8, $DD, $D9, $D7, $DA
 );

 WIN_TO_KOI: TDecodePage = (
   $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
   $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
   $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $B3, $A9, $AA, $AB, $AC, $AD, $AE, $AF,
   $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $A3, $B9, $BA, $BB, $BC, $BD, $BE, $BF,
   $E1, $E2, $F7, $E7, $E4, $E5, $F6, $FA, $E9, $EA, $EB, $EC, $ED, $EE, $EF, $F0,
   $F2, $F3, $F4, $F5, $E6, $E8, $E3, $FE, $FB, $FD, $FF, $F9, $F8, $FC, $E0, $F1,
   $C1, $C1, $D7, $C7, $C4, $C5, $D6, $DA, $C9, $CA, $CB, $CC, $CD, $CE, $CF, $D0,
   $D2, $D3, $D4, $D5, $C6, $C8, $C3, $DE, $DB, $DD, $DF, $D9, $D8, $DC, $C0, $D1
 );

var
 dp: TDecodePage;

procedure RecodeFile(dp : TDecodePage; filename: string);
var
 buff: PByte;
 f: file;
 size, i, value: integer;
 adres: pointer;
begin
 AssignFile(f, filename);
 ReSet(f, 1);
 size := FileSize(f);
 buff := GetMemory(size);
 BlockRead(f, buff^, size);
 CloseFile(f);

 for i := 0 to size-1 do
 begin
   adres := Pointer(DWORD(@buff^) + i);
   value := PByte(adres)^;
   if value > 127 then
     PByte(adres)^ := dp[value - 128];
 end;

 Rewrite(f, size);
 BlockWrite(f, buff^, 1);
 CloseFile(f);
 Dispose(buff);
end;


 
з. танька   (2006-01-14 22:09) [4]

остальные таблички (для Dos, Mac и т.п.) можно посмотреть в интернете или если у тебя установлен TheBat, Options->Preferences->Character Sets


 
Vovik   (2006-01-14 23:46) [5]

мне просто надо чтобы текстовый файл сохранялся в кодировке DOS
но за это тоже пасиба (поподробнее : текст печатается в MEMO и сохраняется в файл в кодировке DOS) если есть то нужно код поопроще :|


 
з. танька   (2006-01-15 00:14) [6]

ок.. вот тебе досовская табличка:
 WIN_TO_DOS: TDecodePage = (
   $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
   $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
   $A0, $A1, $A2, $F1, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF,
   $B0, $B1, $B2, $F0, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF,
   $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
   $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
   $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF,
   $E0, $E1, $E2, $E3, $E4, $E5, $E6, $E7, $E8, $E9, $EA, $EB, $EC, $ED, $EE, $EF
 );

вставляешь её в приведенный выше код, и пишешь что-то вроде

procedure TForm1.Button1Click(Sender: TObject);
var
 f: file;
 sz, i, value: integer;
 adres: pointer;
 buff: PChar;
begin
 GetMem(buff, Length(Memo1.Text));
 sz := Memo1.GetTextBuf(buff, Length(Memo1.Text));
 for i := 0 to sz-1 do
 begin
   adres := Pointer(DWORD(@buff^) + i);
   value := PByte(adres)^;
   if value > 127 then
     PByte(adres)^ := WIN_TO_DOS[value - 128];
 end;

теперь у тебя в памяти по указателю buff находится текст, переведенный в DOS-кодировку. Можешь сохранить его в файл ф-цией BlockWrite, или например процедурой SetTextBuf показать в другом Memo, перед этим не забудь шрифт Terminal поставить тама....


 
з. танька   (2006-01-15 00:23) [7]

зы шо непонятно в коде?

buff - указатель на начало блока в памяти, который мы выделяем для хранения перекодированного текста,

Pointer(DWORD(@buff^) + i) - адрес i-го символа в тексте, который мы перекодируем в соответствии с таблицей..

PByte(adres)^ - значение по этому адресу. Если оно > 127, значит это национальная половина кодовой таблицы, заменяем это значение на соответствующее ему значение в досовской кодировке.. .по табличке...


 
VirEx ©   (2006-01-15 01:10) [8]

кхе кхе, CharToOEM


 
з. танька   (2006-01-15 12:03) [9]


> VirEx ©   (15.01.06 01:10) [8]

мм.. хитрО :)


 
tesseract ©   (2006-01-16 13:34) [10]

Раз уж мода такая ещё один вариант:

function DosConvert(Conv:string):string;
var
Temp:String;i,t:cardinal;
begin
Temp:="";
for i:=1 to length(Conv) do
begin
t:=Ord(Conv[i]);
 if (t>$bf) then
   if (t<$f0) then t:=t-$40;
 if (t>$ef) then t:=t-$10;
 Temp:=temp+chr(t);
end;
Result:=temp;
end;

function WinConvert(Conv:string):string;
var
Temp:String;i,t:cardinal;
begin
Temp:="";
for i:=1 to length(Conv) do
begin
t:=Ord(Conv[i]);
if (t>223) then t:=t+$10;
 if (t>127) then
   if (t<176) then t:=t+$40;
 Temp:=temp+chr(t);
end;
Result:=temp;
end;




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

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

Наверх




Память: 0.5 MB
Время: 0.03 c
6-1129620575
antoxa2005
2005-10-18 11:29
2006.01.29
http://www.delphimaster.ru/forum/add-4.html - Как сохранить файл?


4-1131065389
gdaujk
2005-11-04 03:49
2006.01.29
Способы автозагрузки


3-1133515483
Goast
2005-12-02 12:24
2006.01.29
Не могу удалить запись!!!


1-1134649852
dracula
2005-12-15 15:30
2006.01.29
Помогите разобраться с завершением потока.


2-1137093363
SergP
2006-01-12 22:16
2006.01.29
Как правильно описать тип (запись) с "виртуальными" полями?