如何写入Delphi文件,oem编码?
如何设置编码?由字符串编码由
设置setCodePage(RawBytes;Word;boolean);
答案 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()
的返回值。或者使用TFileStream
或FileWrite()
手动写入文件,然后在撰写期间使用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