【问题标题】:Write Unicode (UTF-8) text file写入 Unicode (UTF-8) 文本文件
【发布时间】:2020-11-28 21:56:31
【问题描述】:

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

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

【问题讨论】:

  • 为什么在现代版本的 Delphi 中使用 1980 文件 I/O?请改用TFileStream。它已经存在了 2 多年了。您正在使用来自 Turbo Pascal 1 的文件 I/O。即使在处理文本文件时使用 TStringList.SaveToFile 也会更好。
  • 或者更好的是,改用TStreamWriter

标签: delphi unicode character-encoding text-files delphi-10.3-rio


【解决方案1】:

您根本不应该使用旧的 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等吧。

【讨论】:

    【解决方案2】:

    其他用户为您提供了选项,但没有人回答(我猜)。您不能使用 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 执行。您将了解到,尽管u 是 UTF8 编码的,但在某些时候会切换回 Ansi。

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

    Assign(FileName,CP_UTF8);
    

    查看System.Assign的帮助

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 2011-05-06
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2012-12-19
      相关资源
      最近更新 更多