【问题标题】:Open an ANSI file and Save a a Unicode file using Delphi使用 Delphi 打开一个 ANSI 文件并保存一个 Unicode 文件
【发布时间】:2010-09-14 13:49:16
【问题描述】:

由于某种原因,最近我的许多客户端系统上的 *.UDL 文件不再兼容,因为它们曾经保存为 ANSI 文件,它不再与预期的 UNICODE 文件格式兼容。最终结果是一个错误对话框,指出“文件不是有效的复合文件”。

以编程方式打开这些文件并保存为 unicode 文件的最简单方法是什么?我知道我可以通过在记事本中打开每个文件然后保存为同一个文件但在另存为对话框的编码部分中选择“unicode”来做到这一点,但我需要在程序中执行此操作以减少支持来电。

这个问题很容易重复,只需在目录中创建一个*.txt文件,将其重命名为*.UDL,然后使用microsoft编辑器进行编辑。然后在记事本中打开它并将其另存为 ANSI 编码文件。尝试从 udl 编辑器打开 udl,它会告诉您它已损坏。然后将其保存(使用记事本)为 Unicode 编码文件,它将再次正确打开。

【问题讨论】:

  • 我们说的是什么版本的 Delphi?

标签: delphi unicode delphi-2009 delphi-2006


【解决方案1】:

好的,使用 delphi 2009,我能够提出以下似乎可以工作的代码,但它是进行这种转换的正确方法吗?

var
  sl : TStrings;
  FileName : string;
begin
  FileName := fServerDir+'configuration\hdconfig4.udl';
  sl := TStringList.Create;
  try
    sl.LoadFromFile(FileName, TEncoding.Default);
    sl.SaveToFile(FileName, TEncoding.Unicode);
  finally
    sl.Free;
  end;
end;

【讨论】:

  • 是的,TStringList 应该更好:)
  • 除此之外,代码很好(而且它也可以,我刚刚检查过)。
  • 您可以使用该代码导致访问冲突,将第一行更改为: s1 := nil;编码;=无;尝试 sl := tStringList.Create;编码 := TUnicodeEncoding.Create;这样,如果 TStringList.Create 出现问题,Enc.Free 不会导致访问冲突。
  • LoadFromStream 和 SaveToStream 怎么样,这样就不需要文件了,而且应该更快。
  • 不要直接创建 TUnicodeEncoding。请改用 TEncoding.Unicode。此外,由于您知道 Ansi 中源文件的编码,因此您应该将其指定给 LoadFromFile(),而不是让它尝试自动确定并可能猜错。
【解决方案2】:

这对我的TGpTextFile 单元来说非常简单。我将整理一个简短的示例并将其发布在此处。

新的 Delphi 2009 也应该非常简单 - 你可能在使用它吗?

编辑:这是他如何使用我在 2009 年之前的 Delphis 中的东西。

var
  strAnsi   : TGpTextFile;
  strUnicode: TGpTextFile;
begin
  strAnsi := TGpTextFile.Create('c:\0\test.udl');
  try
    strAnsi.Reset; // you can also specify non-default 8-bit codepage here
    strUnicode := TGpTextFile.Create('c:\0\test-out.udl');
    try
      strUnicode.Rewrite([cfUnicode]);
      while not strAnsi.Eof do
        strUnicode.Writeln(strAnsi.Readln);
    finally FreeAndNil(strUnicode); end;
  finally FreeAndNil(strAnsi); end;
end;

许可证:上面的代码片段属于公共领域。随心所欲地使用它。

【讨论】:

    猜你喜欢
    • 2016-04-17
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多