【问题标题】:How can a text file be converted from ANSI to UTF-8 with Delphi 7?如何使用 Delphi 7 将文本文件从 ANSI 转换为 UTF-8?
【发布时间】:2010-10-17 04:41:07
【问题描述】:

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

【问题讨论】:

  • ANSI 并不是一个真正的字符编码名称; Windows 通常使用“ANSI”来表示 Windows-1252。 stackoverflow.com/questions/701882
  • @Miles:Windows 使用“ANSI”来表示您的语言环境。日本 Windows 用户将是 SJIS; GB2312 S-Chinese windows 用户等...
  • 您能解释一下到底发生了什么,所以您“没有成功”吗?

标签: delphi utf-8 character-encoding delphi-7 ansi


【解决方案1】:

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;

【讨论】:

  • OP 将问题标记为 delphi-7。在Delphi 7中,字符串默认为ANSU,所以TStringList中存在的字符串也是ANSI。你确定这会起作用吗?
  • @AlexSC 是(我假设文件是​​使用 Delphi 程序使用的相同默认 ANSI 代码页创建的)
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    var
      Latin1Encoding: TEncoding;
    begin
      Latin1Encoding := TEncoding.GetEncoding(28591);
      try
           MyTStringList.SaveToFile('some file.txt', Latin1Encoding);
      finally
          Latin1Encoding.Free;
      end;
    end;
    

    【讨论】:

      【解决方案4】:

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


      问题的正确答案 - 这并不容易 - 基本上由树步骤组成:

      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 后代。

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

      【讨论】:

      • 问题是关于将文件内容从ANSI转换为UTF-8,文件名(在备忘录字段中)是一个不同的问题iiuc
      • @mjn - 不。在 Yilmaz Ekici 写的关于备忘录中文件列表的问题中 “这个程序在备忘录中列出了这些文件的路径和名称。” ,与文件内容无关。现在(s)他可能想问关于文件内容转换的问题,但(s)他没有。
      • 1) 题目以How can a text file be converted ...开头 2) 提到文件列表后,题目以I need convert these files继续。
      【解决方案5】:

      我只做了这个:

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

      【讨论】:

        【解决方案6】:

        你是说 ASCII 吗?

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

        【讨论】:

        • 不,我是说 ANSI。打开一个txt文件。(记事本)文件---->另存为-------->编码----->ANSI或UTF-8或...---->保存我希望,这有助于看到我的目标......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 2015-10-06
        • 1970-01-01
        • 2014-02-17
        • 2015-10-06
        • 2011-11-07
        • 1970-01-01
        相关资源
        最近更新 更多