RTF本质是带控制字的ASCII纯文本,需严格遵循规范:控制字以开头,段落以par结尾,{}括号必须匹配,头部含{ tf1nsideff0等声明,中文用uc1ud0转义,换行用line或par,推荐std::ostringstream拼接。

RTF格式本质是纯文本,不是XML或HTML
RTF(Rich Text Format)没有解析器、不依赖运行时库,它就是带控制字的ASCII文本。导出RTF = 拼接字符串,但必须严格遵守规范:所有控制字以开头,段落以par结尾,字体/颜色/样式需成对嵌套,且{}括号必须严格匹配。常见错误是漏写par导致文字堆叠,或嵌套错位让整个文档在Word里显示为乱码。
- RTF头部必须包含
{ tf1nsideff0{onttbl{0nilcharset0 Calibri;}}等基础声明,缺一则被识别为纯文本 - 中文需用
uc1ud0配合Unicode转义(如'e4'bd'a0'e5'a5'bd),直接写UTF-8字节会乱码 - 换行不能只用
,必须显式写line(行内换行)或par(段落结束)
用std::ostringstream拼接比std::string +=更安全
频繁字符串拼接易引发内存重分配,且不易调试控制字顺序。用std::ostringstream可逐段写入,最后调用.str()获取完整RTF内容,也方便在中间插入调试输出(比如每段后加oss )。
- 避免手写
"\b" + text + "\b0"这类拼接——C++中"\b"是退格符,实际要写"\\b" - 颜色表需提前定义,例如
oss ,后续用<code>\cf1引用红色 - 字体大小用
\fs24(单位是半磅),不是像素或CSS的px
导出表格时必须用\trowd和\cell控制结构
RTF没有<table>概念,表格靠<code>\trowd(行定义)、\clwWidth(列宽)、\intbl(单元格内容)和\cell(单元格结束)硬编码。漏掉任一控制字,Word会忽略整行甚至崩溃。
- 每行开头必须写
\trowd\trgaph108\trleft0,然后对每列写\clwWidth1440\clvertalt\clpadl100\clpadr100 - 单元格内容前加
\intbl,内容后紧跟\cell,最后以\row结束该行 - 合并单元格需用
\clspan2并跳过对应\cell,但\clspanN必须与后续\cell数量匹配,否则解析失败
生成后务必用std::ofstream以二进制模式写入
RTF文件末尾需有
(LF),但Windows默认文本模式会把
转成
,破坏RTF结构;某些编辑器还会在文件末尾悄悄加BOM。必须用std::ofstream file("out.rtf", std::ios::binary)写入,并确保字符串末尾有'
'。
立即学习“C++免费学习笔记(深入)”;
- 写入前检查
oss.str().back() == ' ',没有就oss - 不要用
fopen(..., "w"),C标准库的文本模式会干扰和 - 生成的RTF文件可用记事本打开验证——如果看到明文控制字且结构清晰,大概率能被Word正确读取
最易被忽略的是Unicode转义和括号嵌套层级:一个{没配对,后面所有格式都会失效;一个中文字符转义错两位,整段变方块。建议先写最简“你好”示例,确认能打开,再逐步加粗、颜色、表格。



















