通常、ラテン語のテキストを期待しているのに中国語のテキストが表示される場合は、ANSI テキストを UTF-16 であるかのように解釈していることを意味します。このことから、UTF-16 テキストを書き出すつもりであると推測されますが、実際には ANSI テキストを書き出しています。これは、Unicode 以前の Delphi を使用していることを意味します。
ファイルを上書きし続ける理由に関しては、それはfmCreate
. 本当にやりたいことは、既存のファイルを書き込みモードで開くか、ファイルが存在しない場合は新しいファイルを作成することです。Win32 API 関数はOPEN_ALWAYS
作成処理でそれをサポートします。しかし、それは では利用できませんTFileStream.Create
。したがって、直接使用THandleStream
して呼び出す必要がありますCreateFile
。新しいバージョンの Delphi では、機能TFile.Open
が公開されていることに注意してくださいOPEN_ALWAYS
。しかし、あなたが使用している Delphi は古すぎるというのが私の推論です。
THandleStream
を使用して正しく呼び出すことができると仮定すると、CreateFile
UTF-16 テキストを書き出すだけで済みます。最も簡単な方法は、を使用することWideString
です。次のようなコードを記述できます。
var
ws: WideString;
....
Stream.Seek(0, soFromEnd);
ws := TimeToStr(Now) + sLineBreak;
Stream.WriteBuffer(PWideChar(ws)^, SizeOf(WideChar)*Length(ws));
一方、おそらく中国人はここから来ています:
fs.write(i, sizeof(i));
このコードは、単純にファイルへのポインターを書き込みます。あなたは確かにそれをしたくないので、その行を削除する必要があります. 完全を期すために、Unicode Delphi を使用している場合は、非常に似た方法でテキストを記述します。このような:
var
s: string;
....
Stream.Seek(0, soFromEnd);
s := TimeToStr(Now) + sLineBreak;
Stream.WriteBuffer(PWideChar(s)^, SizeOf(WideChar)*Length(s));
ストリームへの追加に戻ると、次のように実行されます。
var
hFile: THandle;
....
hFile := CreateFile(
PChar(LogFileName),
GENERIC_WRITE,
FILE_SHARE_READ,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0
);
Win32Check(hFile<>INVALID_HANDLE_VALUE);
Try
Stream := THandleStream.Create(hFile);
Try
.... code to write to the stream goes here
Finally
Stream.Free;
End;
Finally
CloseHandle(hFile);
End;
最後に、この回答では、あなたの環境について多くの推測をしなければなりませんでした. 今後は、使用する Delphi のバージョンを常に含めてください。そして常にあなたの目標の明確な声明を含めてください。