delphi写入文件oem编码

时间:2011-03-20 15:01:25

标签: delphi encoding

如何写入Delphi文件,oem编码?

如何设置编码?由字符串编码由

设置
setCodePage(RawBytes;Word;boolean);

4 个答案:

答案 0 :(得分:3)

您需要Windows API函数CharToOemBuff()


修改

受@Free Consulting的启发,上面的API就是你在旧的非Unicode Delphi中使用的。

正如@Free Consulting正确指出的那样,Delphi的新版本提供了广泛的代码页翻译服务。作为旧式Pascal I / O的更现代的变体,您可以使用以指定编码保存的TStringList。

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

答案 1 :(得分:1)

我写了一个函数来做到这一点。它不漂亮,但它有效。

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;

答案 2 :(得分:1)

TStringList.SaveToFile()有一个TEncoding参数,您可以使用TEncoding.GetEncoding()为任何已安装的代码页获取编码对象,因此您可以为此指定GetOEMCP()的返回值。或者使用TFileStreamFileWrite()手动写入文件,然后在撰写期间使用TEncoding.GetBytes()String值进行编码。

答案 3 :(得分:-2)

轻松自如。它取决于要使用的文件I / O方法。一个例子:

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;

没有关于Pascal I / O的谣言,请:-P