Форум: "Начинающим";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Внизкодировки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c