0

この関数を使用してファイルを文字列に読み取ります

function LoadFile(const FileName: TFileName): string;
begin
  with TFileStream.Create(FileName,
      fmOpenRead or fmShareDenyWrite) do begin
    try
      SetLength(Result, Size);
      Read(Pointer(Result)^, Size);
    except
      Result := '';  
      Free;
      raise;
    end;
    Free;
  end;
end;

これがファイルのテキストです:

version  

LoadFileの戻り値は次のとおりです。

'ÿþv'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0

新しいファイルに「verabc」を含めたい。問題は、「sion」を「abc」に置き換えるのにまだ問題があることです。D2007を使用しています。#0をすべて削除すると、結果は漢字になります。

4

2 に答える 2

8

あなたが思うのは、ファイルのテキストは実際にはファイルのテキストではないということです。文字列変数に読み込んだ内容は正確です。リトルエンディアンUTF-16としてエンコードされたUnicodeテキストファイルがあります。最初の2バイトはバイト順マークを表し、その後のバイトの各ペアは文字列の別の文字です。

Unicodeファイルを読み取る場合は、などのUnicodeデータ型を使用する必要がありますWideString。文字列の長さを設定するときにファイルサイズを2で割り、最初の2バイトを破棄する必要があります。

読み取っているファイルの種類がわからない場合は、最初に最初の2バイトまたは3バイトを読み取る必要があります。上記のように、最初の2バイトが$ ff $ feの場合、リトルエンディアンのUTF-16ファイルがある可能性があります。ファイルの残りの部分をWideString、またはUnicodeStringそのタイプの場合はに読み込みます。$ fe $ ffの場合、ビッグエンディアンである可能性があります。ファイルの残りの部分をに読み込んでからWideString、バイトの各ペアの順序を入れ替えます。最初の2バイトが$ef$ bbの場合、3番目のバイトを確認します。$ bfの場合、それらはおそらくUTF-8バイトオーダーマークです。3つすべてを破棄し、ファイルの残りの部分をAnsiStringまたはバイトの配列に読み込んでから、のような関数を使用しUTF8Decodeてそれを。に変換しWideStringます。

にデータを入れるとWideString、デバッガーはデータにが含まれていることを示しますversion。Unicode対応バージョンを使用StringReplaceして置換を行うのに問題はありません。

于 2010-07-01T07:44:43.587 に答える
0

Unicodeでエンコードされたテキストファイルをロードしているようです。 0ラテン文字を示します。

Unicodeテキストを処理したくない場合は、ファイルを保存するときにエディタでANSIエンコーディングを選択してください。

Unicodeエンコーディングが必要な場合は、を使用WideCharToStringしてANSI文字列に変換するか、sを削除してください0。ただし、後者は最善の解決策ではありません。また、先頭の2文字を削除しÿþます。
エディターはそれらのバイトを配置して、ファイルをUnicodeとしてマークします。

于 2010-07-01T07:42:49.817 に答える