Delphi запись в файл oem кодировка - PullRequest
1 голос
/ 20 марта 2011

Как можно записать в файлы Delphi кодировку oem?

Как установить кодировку?так как строковое кодирование установлено

setCodePage(RawBytes;Word;boolean);

Ответы [ 4 ]

3 голосов
/ 20 марта 2011

Вам нужна функция Windows API CharToOemBuff().


EDIT

Вдохновленный @Free Consulting, вышеуказанный API-интерфейс - это то, что вы использовали бы в старых версиях Delphi, отличных от Unicode.

Как правильно отмечает @Free Consulting, новые версии Delphi предлагают обширные услуги по переводу кодовых страниц. В качестве более современного варианта ввода-вывода Pascal старого стиля вы можете использовать TStringList, сохраненный с указанной кодировкой.

Encoding := TEncoding.GetEncoding(GetOEMCP);
Try
  StringList.SaveToFile('test.txt', Encoding);
Finally
  Encoding.Free;
End;
1 голос
/ 23 марта 2011

TStringList.SaveToFile() имеет параметр TEncoding, вы можете использовать TEncoding.GetEncoding(), чтобы получить объект кодирования для любой установленной кодовой страницы, поэтому вы можете указать для него возвращаемое значение GetOEMCP(). Или используйте TFileStream или FileWrite() для записи в файл вручную, а затем используйте TEncoding.GetBytes() для кодирования String значений во время записи.

1 голос
/ 22 марта 2011

Я написал функцию, которая делает это. Это не красиво, но это работает.

function SetFileContent(aFileName: string; aFileContent: string; out aErrorMsg: string; aEncoding: TEncoding = nil; aRecreateFile: Boolean = True): Boolean;
var
  vStream: TFileStream;
  vCurEncoding: TEncoding;
  vPreamble, vContent: TBytes;
  vOffSet: Integer;

  procedure _SetFileContent(aNewFile: Boolean);
  begin
    if aNewFile then begin
      vStream := TFileStream.Create(aFileName, fmCreate);
      try
        vPreamble := aEncoding.GetPreamble;
        If Length(vPreamble) > 0 then begin
          vStream.WriteBuffer(Pointer(vPreamble)^, Length(vPreamble));
        end;
        vStream.WriteBuffer(Pointer(vContent)^, Length(vContent));
      finally
        vStream.Free;
      End;
    end
    else begin
      vStream := TFileStream.Create(aFileName, fmOpenWrite);
      try
        vStream.Position := vStream.Size;
        vStream.WriteBuffer(Pointer(vContent)^, Length(vContent));
      finally
        vStream.Free;
      end;
    end;
  end;

begin
  Result := True;
  try
    vContent := BytesOf(aFileContent);
    vCurEncoding := nil;
    if aEncoding = nil then begin
      aEncoding := TEncoding.Default;
    end;
    vOffSet := TEncoding.GetBufferEncoding(vContent, vCurEncoding);
    if (vCurEncoding <> aEncoding) and aRecreateFile then begin
      vContent := TEncoding.Convert(vCurEncoding, aEncoding, vContent, vOffSet,     Length(vContent) - vOffSet);
    end;
    if FileExists(aFileName) then begin
      if aRecreateFile then begin
        _SetFileContent(True);
      end
      else begin
        _SetFileContent(False);
      end;
    end
    else begin
      _SetFileContent(True);
    end;
  except
    on E: Exception do begin
      Result := False;
      aErrorMsg := 'There was an error while trying to write the string ' + aFileContent + ' in the file ' + aFileName + '. Error: ' + E.Message;
    end;
  end;
end;
0 голосов
/ 20 марта 2011

С легкостью. Это зависит от метода ввода / вывода файла, который будет использоваться. Пример одного:

procedure TForm11.FormCreate(Sender: TObject);
var
  S: string;
begin
  DefaultSystemCodePage := GetOEMCP(); 
  S := 'Если используешь мой код, то ты должен мне почку';
  AssignFile(Output, 'license.txt');
  Rewrite(Output);
  Write(Output, S); // converts to single byte here
  CloseFile(Output);
  Application.Terminate;
end;

НЕТ бум рэпа о вводе-выводе Паскаля, пожалуйста: -P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...