我用 Delphi 7 编写了一个程序,它*.srt
在硬盘驱动器上搜索文件。该程序在备忘录中列出了这些文件的路径和名称。现在我需要将这些文件从 ANSI 转换为 UTF-8,但我没有成功。
6 回答
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;
看一下GpTextStream,它看起来可以与 Delphi 7 一起使用。它能够在旧版本的 Delphi 中读取/写入 unicode 文件(尽管可以与 Delphi 2009 一起使用)并且应该有助于您的转换。
在开始编码之前,请阅读整个答案。
问题的正确答案-这并不容易- 基本上包括树步骤:
- 您必须确定计算机上使用的 ANSI 代码页。您可以通过使用 Windows API 中的 GetACP() 函数来实现此目标。(重要:您必须在文件名检索后尽快检索代码页,因为它可以由用户更改。)
- 您必须使用正确的 CodePage 参数(在上一步中检索)调用 MultiByteToWideChar() Windows API 函数,将 ANSI 字符串转换为 Unicode。在这一步之后,您将获得一个包含文件名列表的 UTF-16 字符串(实际上是一个 WideString)。
- 您必须使用 UTF8Encode() 或 WideCharToMultiByte() Windows API 将 Unicode 字符串转换为 UTF-8。此函数将返回您需要的 UTF-8 字符串。
但是,此解决方案将返回一个包含输入 ANSI 字符串的 UTF-8 字符串,这可能不是解决问题的最佳方法,因为当 ANSI 函数返回文件名时,文件名可能已经损坏,因此不能保证正确的文件名.
正确解决您的问题方法更复杂:
如果您想确保您的文件名列表完全干净,您必须确保它根本不会转换为 ANSI。您可以通过显式使用文件处理 API 的“W”版本来做到这一点。在这种情况下——当然——你不能使用 TFileStream 和其他 ANSI 文件处理对象,而是直接调用 Windows API。
不是这样难,但是如果您已经有一个基于例如 TFileStream 构建的复杂框架,那么在@ss 中可能会有点痛苦。在这种情况下,最好的解决方案是创建一个使用适当 API 的 TStream 后代。
我希望我的回答对您或任何必须处理相同问题的人有所帮助。(不久前我不得不这样做。)
var
Latin1Encoding: TEncoding;
begin
Latin1Encoding := TEncoding.GetEncoding(28591);
try
MyTStringList.SaveToFile('some file.txt', Latin1Encoding);
finally
Latin1Encoding.Free;
end;
end;
我只做了这个:
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