编写 Unicode (UTF-8) 文本文件
Write Unicode (UTF-8) text file
如何在 Delphi 中编写 Unicode 文本文件?
目前我只是简单地使用AssignFile
、RewriteFile
和Writeln
,但这不会写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,那也很好。
忘记 AssignFile
、Reset
、Rewrite
、Append
、CloseFile
等
其他用户给了你选项,但没有人回答(我猜)。您不能使用 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
的帮助
如何在 Delphi 中编写 Unicode 文本文件?
目前我只是简单地使用AssignFile
、RewriteFile
和Writeln
,但这不会写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,那也很好。
忘记 AssignFile
、Reset
、Rewrite
、Append
、CloseFile
等
其他用户给了你选项,但没有人回答(我猜)。您不能使用 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