编写 Unicode (UTF-8) 文本文件

Write Unicode (UTF-8) text file

如何在 Delphi 中编写 Unicode 文本文件?

目前我只是简单地使用AssignFileRewriteFileWriteln,但这不会写Unicode字符。

你根本不应该使用旧的 Pascal I/O。它在 80 年代发挥了作用,但在今天已经过时了。


本世纪,可以使用TStringList。这在Delphi中很常用。例如,VCL 控件使用 TStrings 来访问备忘录的文本行和组合框或列表框的项目。

var SL := TStringList.Create;
try
  SL.Add('∫cos(x)dx = sin(x) + C');
  SL.Add('¬(a ∧ b) ⇔ ¬a ∨ ¬b');
  SL.SaveToFile(FileName, TEncoding.UTF8);
finally
  SL.Free;
end;

对于更高级的需求,您可以使用 TStreamWriter:

var SW := TStreamWriter.Create(FileName, False, TEncoding.UTF8);
try
  SW.WriteLine('αβγδε');
  SW.WriteLine('ωφψξη');
finally
  SW.Free;
end;

对于非常简单的需求,IOUtils.pas 中有新的 TFile 方法:

var S := '⌬ is aromatic.';
TFile.WriteAllText(FileName, S, TEncoding.UTF8);         // string (possibly with linebreaks)

var Lines: TArray<string>;
Lines := ['☃ is cold.', '☼ is hot.'];
TFile.WriteAllLines(FileName, Lines, TEncoding.UTF8);    // string array

如您所见,所有这些现代选项都允许您将 UTF8 指定为编码。如果您更喜欢使用其他一些编码,例如 UTF16,那也很好。


忘记 AssignFileResetRewriteAppendCloseFile

其他用户给了你选项,但没有人回答(我猜)。您不能使用 Writeln 编写 UTF8,因为在运行时,任何字符串都会切换回 Ansi。然而所有的提议似乎都很好。

试试这个短节目

program utf8;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var s : string; u : AnsiString;   some : Text;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    Assign(some,'data.txt');
    rewrite(some);
    s := 'física';
    u := UTF8Encode (s);
    writeln(some,s);
    writeln(some,u);
    Close(some);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

启用“使用调试 dcu”并仔细遵循 Writeln 执行。您将了解到,尽管采用 UTF8 编码,但 u 在某些时候会切换回 Ansi。

版本: 我错了。你确实可以:

Assign(FileName,CP_UTF8);

查看 System.Assign

的帮助