You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi中写入Unicode(UTF-8)文本文件?

在Delphi中写入UTF-8文本文件的几种方法

嘿,我来帮你解决这个Unicode写入的问题~你之前用的AssignFile、RewriteFile那套传统文件操作方法,确实对Unicode字符支持不太友好,毕竟它们原本是为ANSI编码设计的。不过在Delphi里有几种简单靠谱的方式可以实现UTF-8文本文件的写入,我给你详细说说:

方法一:用TStreamWriter(推荐,Delphi 2009及以上适用)

这是最简洁现代的方式,TStreamWriter原生支持指定编码,完全适配Unicode字符串。代码示例如下:

var
  StreamWriter: TStreamWriter;
begin
  // 创建实例:参数分别是文件名、是否追加(False为覆盖)、编码、缓冲区大小(可选)
  // 最后一个布尔参数控制是否写入UTF-8 BOM,默认是True,不需要的话可以设为False
  StreamWriter := TStreamWriter.Create('utf8_output.txt', False, TEncoding.UTF8, 1024);
  try
    // 直接写入Unicode字符串,自动转UTF-8
    StreamWriter.WriteLine('这是中文Unicode测试');
    StreamWriter.WriteLine('多国语言:Español, Français, 日本語');
    StreamWriter.WriteLine('特殊符号:𝄞𝌆😀');
  finally
    StreamWriter.Free; // 别忘了释放资源
  end;
end;

这个方法不需要手动处理编码转换,TStreamWriter会帮你搞定所有细节,非常省心。

方法二:用TFileStream手动处理(适合底层控制或旧版本兼容)

如果需要更精确的控制(比如是否写入BOM、自定义缓冲区等),可以用TFileStream直接操作字节流:

var
  FileStream: TFileStream;
  UTF8Content: UTF8String;
  UTF8BOM: array[0..2] of Byte;
begin
  FileStream := TFileStream.Create('utf8_with_bom.txt', fmCreate or fmShareDenyWrite);
  try
    // 可选:写入UTF-8 BOM(有些软件需要这个来识别编码)
    UTF8BOM[0] := $EF;
    UTF8BOM[1] := $BB;
    UTF8BOM[2] := $BF;
    FileStream.WriteBuffer(UTF8BOM, SizeOf(UTF8BOM));

    // 将Unicode字符串转换为UTF-8编码的字节串
    UTF8Content := UTF8Encode('手动转换的Unicode文本');
    FileStream.WriteBuffer(UTF8Content[1], Length(UTF8Content));

    // 写入换行和另一行内容
    UTF8Content := #13#10'换行后的内容:Привет, мир!';
    FileStream.WriteBuffer(UTF8Content[1], Length(UTF8Content));
  finally
    FileStream.Free;
  end;
end;

注意:如果不需要BOM,直接跳过写入BOM的步骤即可。

方法三:给传统TextFile添加UTF-8支持(Delphi 2009+适用)

如果你习惯用AssignFile那套语法,也可以通过SetFileEncoding函数让它支持UTF-8:

var
  TextFile: TextFile;
  UnicodeStr: string;
begin
  UnicodeStr := '用传统方法写Unicode:한글 테스트';
  AssignFile(TextFile, 'utf8_textfile.txt');
  try
    // 设置文件编码为UTF-8
    SetFileEncoding(TextFile, TEncoding.UTF8);
    Rewrite(TextFile); // 打开文件准备写入
    Writeln(TextFile, UnicodeStr); // 直接写入Unicode字符串
  finally
    CloseFile(TextFile); // 关闭文件
  end;
end;

这个方法保留了你熟悉的操作流程,同时解决了Unicode支持的问题。

总结一下,优先推荐用TStreamWriter,它的API最友好,也最不容易出错。如果有特殊需求再考虑后面两种方法。

内容的提问来源于stack exchange,提问作者Wolfgang Bures

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:34:14