Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
6-1129401928
Black-Grin
2005-10-15 22:45
2006.01.29
NMFTP вызов LIST


15-1136880956
element
2006-01-10 11:15
2006.01.29
HELP PLIZ


15-1136471040
BiggieSmalls
2006-01-05 17:24
2006.01.29
Системный реестр


4-1132324773
Arazel
2005-11-18 17:39
2006.01.29
Hook Shell_TrayWnd, Помогите не в службу, а в дружбу.


15-1136460887
tim@eclear.net
2006-01-05 14:34
2006.01.29
Wanted - Delphi Developers in moscow





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский