3

生成された CSV データ ファイルを処理するコードを追加する Delphi 2006 アプリがあります。TStringList.LoadFromFile は奇妙な結果を出していましたが、ファイルが UTF-16 でエンコードされていることがわかりました。

XE へのアップグレードは計画されていますが、現時点ではオプションではありません。

D2006 でこれらのファイルを処理する最も簡単な方法は何ですか? 問題なく 8 ビット ASCII にマッピングできると想定しています。それらは「純粋な」CSV であり、数字とコンマなどだけです。 -ビットセット。

4

2 に答える 2

4

TStringListは D2006 で UTF-16 をサポートしていないため、ファイル データを手動で読み込んでデコードしてから、出力をTStringList. 例えば:

var
  sl: TStringList;
  {$IFNDEF D2009_OR_LATER}
  ms: TMemoryStream;
  ptr: PWideChar;
  s: AnsiString;
  dlen, slen: Integer;
  {$ENDIF}
begin
  ...
  {$IFDEF D2009_OR_LATER}
  sl.LoadFromFile('...', TEncoding.Unicode);
  {$ELSE}
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile('...');
    ptr := PWideChar(ms.Memory);
    dlen := ms.Size div SizeOf(WideChar);
    if (dlen >= 1) and (PWord(ptr)^ = $FEFF) then
    begin
      Inc(ptr);
      Dec(dlen);
    end;
    slen := WideCharToMultiByte(0, 0, ptr, dlen, nil, 0, nil, nil);
    if slen > 0 then begin
      SetLength(s, slen);
      WideCharToMultiByte(0, 0, ptr, dlen, PAnsiChar(s), slen, nil, nil));
    end;
    sl.Text := s;
  finally
    ms.Free;
  end;
  {$ENDIF}
  ...
end;
于 2011-07-01T08:03:47.657 に答える
1

データ損失のリスクがある場合に備えて、JCL TJclWideStringList の使用を試みることができます。

于 2011-07-14T16:39:00.907 に答える