如何使用Delphi 7将文本文件从ANSI转换为UTF-8?

问题描述 投票:9回答:6

[我用Delphi 7编写了一个程序,该程序在硬盘驱动器上搜索*.srt文件。该程序在备忘录中列出了这些文件的路径和名称。现在我需要将这些文件从ANSI转换为UTF-8,但没有成功。

delphi utf-8 character-encoding delphi-7 ansi
6个回答
9
投票

[Utf8Encode函数将WideString字符串作为参数并返回Utf-8字符串。

示例:

procedure ConvertANSIFileToUTF8File(AInputFileName, AOutputFileName: TFileName);
var
  Strings: TStrings;
begin
  Strings := TStringList.Create;
  try
    Strings.LoadFromFile(AInputFileName);
    Strings.Text := UTF8Encode(Strings.Text);
    Strings.SaveToFile(AOutputFileName);
  finally
    Strings.Free;
  end;
end;

1
投票

[看起来像在Delphi 7中可以使用的GpTextStream。它具有在较早版本的Delphi中读取/写入unicode文件的能力(尽管在Delphi 2009中可以使用,并且可以帮助您进行转换。


0
投票
var
  Latin1Encoding: TEncoding;
begin
  Latin1Encoding := TEncoding.GetEncoding(28591);
  try
       MyTStringList.SaveToFile('some file.txt', Latin1Encoding);
  finally
      Latin1Encoding.Free;
  end;
end;

0
投票

请在开始编码之前阅读完整的答案。


问题的正确答案-而且不是一件容易的事-主要由树形步骤组成:

  1. 您必须确定计算机上使用的ANSI代码页。您可以通过使用Windows API中的GetACP()函数来实现此目标。 (重要:您必须在文件名检索后尽快检索代码页,因为它可以由用户更改。)
  2. 您必须通过使用正确的CodePage参数(在上一步中获取)调用MultiByteToWideChar()Windows API函数,将ANSI字符串转换为Unicode。完成此步骤后,您将得到一个包含文件名列表的UTF-16字符串(实际上是一个WideString)。
  3. 您必须使用UTF8Encode()或WideCharToMultiByte()Windows API将Unicode字符串转换为UTF-8。此函数将返回您需要的UTF-8字符串。

但是此解决方案将返回包含输入ANSI字符串的UTF-8字符串,这可能不是解决问题的最佳方法,因为当ANSI函数返回它们时,文件名可能已经损坏,因此适当的文件名称不能保证


为您的问题提供适当的解决方案的方法更为复杂:

如果要确保您的文件名列表完全干净,则必须确保它不会得到完全转换为ANSI]。您可以通过显式使用文件处理API的“ W”版本来实现。在这种情况下-当然-您不能使用TFileStream和其他ANSI文件处理对象,但是Windows API直接调用。

这不难,但是,如果您已经有一个基于例如TFileStream @@ ss可能有点麻烦。在这种情况下,最好的解决方案是创建一个使用适当API的TStream后代。

我希望我的回答能帮助您或必须解决相同问题的任何人。 (我不久前必须。)

我只这样做:

procedure TForm1.FormCreate(Sender: TObject); begin Strings := TStringList.Create; end; procedure TForm1.Button3Click(Sender: TObject); begin Strings.Text := UTF8Encode(Memo1.Text); Strings.SaveToFile('new.txt'); end;

使用不含BOM的Notepad ++ UTF8进行验证

您是指ASCII吗?

ASCII与UTF-8向后兼容。http://en.wikipedia.org/wiki/UTF-8


0
投票
我只这样做:

-1
投票
您是指ASCII吗?
© www.soinside.com 2019 - 2024. All rights reserved.