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

如何使用Delphi 7将文本文件从ANSI转换为UTF-8?,delphi,utf-8,character-encoding,delphi-7,ansi,Delphi,Utf 8,Character Encoding,Delphi 7,Ansi,我用Delphi7编写了一个程序,它搜索硬盘上的*.srt文件。该程序在备忘录中列出这些文件的路径和名称。现在我需要将这些文件从ANSI转换为UTF-8,但我没有成功。你是说ASCII吗 ASCII与UTF-8向后兼容。 Utf8Encode函数将宽字符串作为参数,并返回Utf-8字符串 样本: procedure ConvertANSIFileToUTF8File(AInputFileName, AOutputFileName: TFileName); var Strings: TStri

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

你是说ASCII吗

ASCII与UTF-8向后兼容。
Utf8Encode函数将宽字符串作为参数,并返回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;
看一看它在Delphi7中运行的情况。它能够在旧版本的Delphi中读/写unicode文件(尽管它可以与Delphi 2009一起使用),这将有助于您进行转换。

在开始编码之前,请阅读完整答案。
问题的正确答案——这不是一个简单的答案——基本上由三个步骤组成:

  • 您必须确定计算机上使用的ANSI代码页。您可以通过使用Windows API中的GetACP()函数来实现这一目标。(重要提示:您必须在检索文件名后尽快检索代码页,因为用户可以更改代码页。)
  • 必须使用正确的代码页参数(在上一步中检索)调用MultiByteToWideChar()Windows API函数,将ANSI字符串转换为Unicode。在此步骤之后,您将得到一个UTF-16字符串(实际上是一个宽字符串),其中包含文件名列表
  • 必须使用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;
    

    使用Notepad++UTF8验证,无BOM

    否,我指的是ANSI。打开一个txt文件。(记事本)文件---->另存为---->编码---->ANSI或UTF-8或…-->保存我希望,这有助于看到我的目标…ANSI不是一个真正合适的字符编码名称;Windows通常使用“ANSI”来表示Windows-1252@迈尔斯:Windows使用“ANSI”来表示您的语言环境。它将是日本windows用户的SJIS;GB2312适用于S-Chinese windows用户等。请您解释一下到底发生了什么,所以您“没有成功”?OP将问题标记为delphi-7。在Delphi7中,字符串默认为ANSU,因此
    TStringList
    中存在的字符串也是ANSI。您确定这会起作用吗?@AlexSC是(我假设文件是使用Delphi程序使用的相同默认ANSI代码页创建的)问题是关于将文件内容从ANSI转换为UTF-8,即文件名(在备注字段中)这是另一个问题iiuc@mjn-否。在问题中,Yilmaz Ekici在备忘录中提到了文件列表,“该程序在备忘录中列出了这些文件的路径和名称”,而不是文件内容。现在,他可能想问关于文件内容转换的问题,但他没有问。1)问题标题以
    如何转换文本文件开始…
    2)提到文件列表后,问题继续以
    我需要转换这些文件
    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;