Вопрос Конвертация ansi файла в dos\oem

Andreo Fadio

Старожил
Не получается в процессе создать батник с русскими символами, за место них или пустота, или знаки ????? ???? получаются.
Код:
var
List: TStringList;
dest, bat: String;
S: String;
D: AnsiString;
begin
  if FileExists(ExpandConstant('{src}\set.bat')) then
   DeleteFile(ExpandConstant('{src}\set.bat'));
  D:= 'типа фраза для теста..';
  dest:= ExpandConstant('{src}');
  bat:= ExpandConstant('{src}\set.bat');
  List:= TStringList.Create;
  CharToOemBuff(D);
  List.Add(D);
  List.SaveToFile(bat);
  List.Free;
end;
Данный пример работает лишь в русском образе системы, а в иностранных не срабатывает. Добавлял конвертацию через CharToOem она работает, а сам файл записывается в кодировке ANSI и в итоге не работает, как положено.
Как можно записать нужную кодировку?
 

sergey3695

Ветеран
Модератор
@Andreo Fadio, List.Add(String(D)); пробовал?
code_language.pascal:
procedure InitializeWizard;
var
  List: TStringList;
  dest, bat: String;
  D: AnsiString;
begin
  if FileExists(ExpandConstant('{src}\set.bat')) then
   DeleteFile(ExpandConstant('{src}\set.bat'));
  D:= 'типа фраза для теста..';
  bat:= ExpandConstant('{src}\set.bat');
  List:= TStringList.Create;
  List.Add(String(D));
  List.SaveToFile(bat);
  List.Free;
end;
 

Andreo Fadio

Старожил
тогда уж лучше так:
Код:
function CharToOem(lpszSrc, lpszDst: AnsiString): longint; external 'CharToOemA@user32.dll stdcall';

function CharToOemStr(strSource: AnsiString): AnsiString;
begin
  SetLength(Result, Length(strSource));
  CharToOem(strSource, Result);
end;

procedure CreateBat;
var
 List: TStringList;
 dest, bat: String;
 D: String;
begin
  if FileExists(ExpandConstant('{src}\set.bat')) then
   DeleteFile(ExpandConstant('{src}\set.bat'));
  D:= 'типа фраза для теста..';
  dest:= ExpandConstant('{src}');
  bat:= ExpandConstant('{src}\set.bat');
  List:= TStringList.Create;
  List.Add(String(CharToOemStr(D)));
  List.SaveToFile(bat);
  List.Free;
end;

Только для иностранных образов все равно не работает из-за отсутствия в них русского языка :)
За место букв одни вопросы
 

Avengerz13

Участник
code_language.pascal:
function CreateFile(): boolean;
var
  Filename : string;
  Lines : TArrayOfString;
begin
  Result := true;
  Filename := ExpandConstant('{src}\file.bat');
  SetArrayLength(Lines, 4);
  
  Lines[0] := 'Привет';
  Lines[1] := 'Мир';
  Lines[2] := 'Hello';
  Lines[3] := 'World';
  
  Result := SaveStringsToUTF8File(Filename, Lines, true);
  exit;
end;

procedure InitializeWizard();
begin
  CreateFile();
end;
 

Avengerz13

Участник
@Andreo Fadio,
code_language.pascal:
function CreateFile(): boolean;
var
  Filename : string;
  Lines : TArrayOfString;
begin
  Result := true;
  Filename := ExpandConstant('{src}\file.bat');
  SetArrayLength(Lines, 7);

  { Ignore first line since it is UTF-8 }
  Lines[0] := '';
  Lines[1] := 'chcp 65001 >NUL';
  Lines[2] := 'set x=Привет Мир';
  Lines[3] := 'chcp 866 >NUL';
  Lines[4] := 'cls';
  Lines[5] := 'echo %x%';
  Lines[6] := 'pause';

  Result := SaveStringsToUTF8File(Filename, Lines, true);
  exit;
end;

procedure InitializeWizard();
begin
  CreateFile();
end;
 
Последнее редактирование:
Сверху