rtf文件不能用file.readalltext直接读取纯文本,因其含控制字和编码问题;应使用richtextbox(winforms)或rtfpipe库(跨平台)解析,且需注意rtf声明的字符集编码。

RTF文件不能直接用File.ReadAllText读取纯文本
RTF不是纯文本格式,哪怕文件后缀是.rtf,里面也混着大量控制字(比如{\b bold}、{\fs24}),直接用File.ReadAllText会得到一堆乱码+格式指令,根本没法用。
常见错误现象:读出来全是{\rtf1\ansi\ansicpg936\deff0...这种开头,或者中文显示成问号、方块——这是编码没解对,更本质的是你压根没解析RTF结构。
- 必须走系统级RTF解析路径,.NET本身不提供轻量RTF转文本API
-
RichTextBox是Windows Forms里最稳定、兼容性最好的方案(支持老版本RTF 1.0到1.9) - 别指望
RichTextBox.LoadFile自动帮你“提取文本”,它只是加载;真正要文本得读RichTextBox.Text属性
用RichTextBox加载并提取纯文本(WinForms环境)
这是最省心、出错率最低的做法,尤其适合桌面工具或内部小工具。核心逻辑就三步:新建控件 → 加载RTF → 读.Text。
注意:这个控件不需要显示在界面上,可以全程隐藏运行。
- 必须引用
System.Windows.Forms,即使你在控制台项目里也要加(NuGet包System.Windows.Forms,.NET 5+需启用Windows兼容模式) - 加载前记得设
RichTextBox.Rtf而不是.Text,否则会把RTF内容当纯文本渲染,导致格式崩坏 - 如果RTF含图片或OLE对象,
.Text会自动跳过它们,只留文字——这反而是优点
RichTextBox rtb = new(); rtb.Rtf = File.ReadAllText(@"C:\doc.rtf"); // 注意:这里必须用Rtf属性赋值 string plainText = rtb.Text; // 这才是你要的纯文本
非WinForms环境(如.NET Core控制台/ASP.NET)怎么处理
没有RichTextBox?那就得自己解析RTF。但别手写——RTF语法嵌套深、转义多、历史变体杂,自己啃标准文档基本是自找麻烦。
推荐用开源库RtfPipe(MIT协议,NuGet可装),它不依赖Windows Forms,纯C#实现,专注“RTF → 文本”这一件事。
- 安装:
dotnet add package RtfPipe - 它不支持所有RTF扩展(比如某些Word专有字段),但日常办公RTF 99%能应付
- 遇到加密RTF或损坏文件会抛
RtfParseException,建议try/catch兜底 - 性能比
RichTextBox略慢(毕竟纯托管解析),但差异在毫秒级,一般无感
using RtfPipe; string rtfContent = File.ReadAllText(@"C:\doc.rtf"); string plainText = Rtf.ToText(rtfContent);
编码问题和特殊字符容易被忽略
RTF本身声明字符集(比如\ansicpg1252或\utf8),但File.ReadAllText默认用UTF-8读,可能错解非ASCII部分——尤其是中文RTF常带\ansicpg936(GBK)。
这不是“提取逻辑”问题,是“读入第一步”就错了。
- 先用
File.ReadAllBytes读原始字节,再按RTF头里的\ansicpg值选编码(查表映射:936→GBK,1252→Windows-1252) - 或者偷懒点:统一用
Encoding.Default(即系统当前ANSI编码),对中文Windows通常就是GBK,兼容性反而好 -
RtfPipe内部已处理编码探测,所以推荐优先用它;自己用RichTextBox时,务必确认File.ReadAllText传了正确Encoding
最稳妥的一行写法:File.ReadAllText(path, Encoding.GetEncoding(936)) —— 如果你知道源RTF是中文版Word生成的。










