开发者

delphi write to file oem encoding

开发者 https://www.devze.com 2023-02-19 00:51 出处:网络
How is it possible to write to Delphi files, oem encoding? How do you set the encoding? as string encoding is开发者_C百科 set by

How is it possible to write to Delphi files, oem encoding?

How do you set the encoding? as string encoding is开发者_C百科 set by

setCodePage(RawBytes;Word;boolean);


You need the Windows API function CharToOemBuff().


EDIT

Inspired by @Free Consulting, the above API is what you would use in an older non-Unicode Delphi.

As @Free Consulting correctly points out, the new versions of Delphi offer extensive code page translation services. As a more modern variant of the old-style Pascal I/O, you could use a TStringList saved with a specified encoding.

Encoding := TEncoding.GetEncoding(GetOEMCP);
Try
  StringList.SaveToFile('test.txt', Encoding);
Finally
  Encoding.Free;
End;


I have a wrote a function that does that. It is no pretty, but it works.

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;


TStringList.SaveToFile() has a TEncoding parameter, you can use TEncoding.GetEncoding() to get an encoding object for any installed codepage, so you can specify the return value of GetOEMCP() for that. Or use TFileStream or FileWrite() to write to a file manually, and then use TEncoding.GetBytes() to encode String values during your writing.


With ease. It depends on file I/O method to be used. Example of one:

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;

NO bum rap about Pascal I/O, please :-P

0

精彩评论

暂无评论...
验证码 换一张
取 消