3

我有一个 Delphi 2006 应用程序,我正在添加代码来处理一些生成的 CSV 数据文件。TStringList.LoadFromFile 给出了奇怪的结果,我刚刚发现文件是 UTF-16 编码的。

计划升级到 XE,但目前不是一个选项。

用 D2006 处理这些文件的最简单方法是什么?我假设它们可以毫无问题地映射到 8 位 ASCII - 它们是“纯” CSV - 只是数字和逗号等,我认为不在 8 中的字符不会有任何问题位设置。

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 回答