在Delphi 2009中从文本文件读取内容

5
我有一个使用UTF8编码的文本文件,我在Delphi 2009中创建了一个应用程序,其中包括一个打开对话框、一个备忘录和一个按钮,并编写了以下代码:
if OpenTextFileDialog1.Execute then
   Memo1.Lines.LoadFromFile(OpenTextFileDialog1.FileName);

当我运行我的应用程序时,我点击按钮并选择我的文本文件,在备忘录中看到:

"Œ ط¯ط± ط¢ظ…â€چظˆط²ط´â€Œ ع©â€چط´â€چط§ظˆط±ط²غŒâ€Œ: ط±"

字符未正确显示。如何解决这个问题?
2个回答

12

如果文件开头没有UTF-8 BOM,则需要告诉LoadFromFile()文件的编码方式,例如:

Memo1.Lines.LoadFromFile(OpenTextFileDialog1.FileName, TEncoding.UTF8); 

5

在OpenTextFile对话框中可以选择编码格式。 OpenTextFileDialog.Encodings表示可用的编码列表,包括默认列表:ANSI、ASCII、Unicode、BigEndian、UTF8和UTF7。

// Optionally add Encoding formats to the list:
FMyEncoding := TMyEncoding.Create;
OpenTextFileDialog1.Encodings.AddObject('MyEncoding', FMyEncoding);
// Don't forget to free FMyEncoding


var
  Encoding : TEncoding;
  EncIndex : Integer;
  Filename : String;
begin
  if OpenTextFileDialog1.Execute(Self.Handle) then
    begin
    Filename := OpenTextFileDialog1.FileName;

    EncIndex := OpenTextFileDialog1.EncodingIndex;
    Encoding := OpenTextFileDialog1.Encodings.Objects[EncIndex] as TEncoding;
    // No Encoding found in Objects, probably a default Encoding:
    if not Assigned(Encoding) then
      Encoding := StandardEncodingFromName(OpenTextFileDialog1.Encodings[EncIndex]);

    //Checking if the file exists
    if FileExists(Filename) then
      //Display the contents in a memo based on the selected encoding.
      Memo1.Lines.LoadFromFile(FileName, Encoding)

我对此很好奇。我不确定你的代码在做什么。Encodings对象是什么?您能否用一些额外的文本和注释详细说明一下呢? - David Heffernan
+1 我不知道这个控件。我对话框是否包括一个下拉列表,允许用户指定编码?我猜这在保存文件时更常见(例如Notepad的方式)。这个控件使用新样式的Vista对话框还是回退到传统的XP对话框? - David Heffernan
是的,它包括一个编码下拉列表。该控件使用XP风格。Vista风格的控件(TFileOpenDialog)默认情况下没有编码下拉列表,但是通过几行代码可以添加一个。 - Arjen van der Spek
可以使用 IFileDialogCustomize 轻松实现,如果我没记错的话。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接