[我用Delphi 7编写了一个程序,该程序在硬盘驱动器上搜索*.srt
文件。该程序在备忘录中列出了这些文件的路径和名称。现在我需要将这些文件从ANSI转换为UTF-8,但没有成功。
[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;
[看起来像在Delphi 7中可以使用的GpTextStream。它具有在较早版本的Delphi中读取/写入unicode文件的能力(尽管在Delphi 2009中可以使用,并且可以帮助您进行转换。
var
Latin1Encoding: TEncoding;
begin
Latin1Encoding := TEncoding.GetEncoding(28591);
try
MyTStringList.SaveToFile('some file.txt', Latin1Encoding);
finally
Latin1Encoding.Free;
end;
end;
问题的正确答案-而且不是一件容易的事-主要由树形步骤组成:
但是此解决方案将返回包含输入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与UTF-8向后兼容。http://en.wikipedia.org/wiki/UTF-8