10

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

4

6 回答 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;
于 2009-07-04T05:15:43.647 回答
1

看一下GpTextStream,它看起来可以与 Delphi 7 一起使用。它能够在旧版本的 Delphi 中读取/写入 unicode 文件(尽管可以与 Delphi 2009 一起使用)并且应该有助于您的转换。

于 2009-07-06T15:41:05.670 回答
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 后代。

我希望我的回答对您或任何必须处理相同问题的人有所帮助。(不久前我不得不这样做。)

于 2013-07-31T14:54:14.853 回答
0
var
  Latin1Encoding: TEncoding;
begin
  Latin1Encoding := TEncoding.GetEncoding(28591);
  try
       MyTStringList.SaveToFile('some file.txt', Latin1Encoding);
  finally
      Latin1Encoding.Free;
  end;
end;
于 2009-07-03T19:25:53.547 回答
0

我只做了这个:

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 验证

于 2020-05-25T20:35:30.480 回答
-1

你是说ASCII吗?

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

于 2009-04-02T18:40:06.350 回答