直接回答
RTF 是带控制词的结构化文本流,不是可直接剥掉大括号的纯文本。组会建立字符和段落状态,destination 承载不同文档结构,转义字节也会影响文本解码。单纯数大括号会被二进制区域破坏;按反斜线切分也会混淆控制词、转义符号与 payload。应先选择真正支持目标 RTF 子集的成熟解析库,并在 Android 上测试准确版本。如果没有库能暴露产品要求的区分,就拒绝或标记不支持,不要静默写一个残缺解析器。 先命名来源 profile 和投影规则。Microsoft RTF 1.9.1 定义了范围很广的格式及许多 destination/扩展;文本导入无需重现 Word 的全部布局。要明确包含哪些主文本组与附属文本源,例如脚注、尾注,以及如何处理页眉、批注、书签、注释、表格和替代内容。保留原始字节,并记录 parser/版本及 destination 策略。文本投影不能称为忠实 Word 渲染;Exchange 专用封装算法也不能套用到所有 RTF。 Unicode 解码需要维护状态。RTF 的 Unicode 转义 token uN(前面有反斜线)表示有符号 16 位 UTF-16 code unit;补充平面字符可由一对高/低 surrogate 的 Unicode 转义表示。ucN 是 Unicode 转义之后要跳过的 ANSI fallback 单位数,不是 Unicode grapheme cluster 数,也不是源文件字节数。它受嵌套 group 作用域影响,离组时恢复先前值。须准确计 token:control word 或 control symbol 各算一个单位;结束 control word 的分隔空格不算。binN 控制词、数值参数和完整二进制 payload 合在一起算一个 fallback 单位,但 reader 仍须跳过声明的 N 个原始 payload 字节。若剩余 fallback 单位尚未用完就遇到 group 开/闭大括号,应在大括号之前停止 fallback 跳过,再按 group 规则正常处理该括号。分别测试各 token 形式与边界,以及负 uN、surrogate pair、嵌套 ucN 覆盖和离组恢复。 旧式文本还依赖字符集控制。文件头可声明默认 ANSI code page,font table 条目也能为当前字体指定 code page,之后某个文本 run 还可能切换字体。十六进制转义字节必须依据活动字体/代码页解码,不能默认当 UTF-8。缺失或不支持的代码页需要明确错误/替换策略,并保留源字节供比较。记录解码决策之后再做文本归一化;Unicode normalization 是另一种产品变换,可能改变原始序列。 二进制跨度必须按字节精确处理。RTF 的 binN 控制词(前面有反斜线)声明紧随其后的 N 个原始字节;跨度内的括号、反斜线和看似控制词的序列都属于 payload,不是语法。跳过前先检查长度上限,使用溢出安全偏移,并在越界或截断时拒绝。不要把嵌入图片、对象或二进制内容当作正文解析。结束位置应是声明跨度之后的字节偏移,因此解析器必须区分字节位置与已解码字符位置。 destination 策略本身就是内容决策。带星号且未知的 destination 可能是元数据或替代文字;RTF reader 规则通常要求将不支持的 starred destination 整组跳过,避免其 token 泄漏到正文。font table、color table 等已知 destination 属于控制元数据,不是正文。字段可能同时包含 instruction 和缓存结果:不得执行字段指令、外链或内嵌对象,并明确是否包含已支持的缓存结果。隐藏文字控制也会让扁平抽取意外暴露内容。必须明示纳入/排除规则,不要假设所有像文本的 token 都是用户可见正文。 将解析输出和模型输入分离。生成只读投影,保留 destination/group 来源、解析器可提供的源偏移、解码警告和 completeness 标签。分别限制字节、嵌套、token、destination、文本量和处理时间。校验投影是否适合任务,显示不支持的部分,并在送入本地处理前让用户核对将包含的文本。parser 与本地模型是独立阶段;本地推理不能证明 parser 安全,解析成功也不等于授权披露或数据可信。 用人工准备的预期文本测试合成夹具:嵌套组状态恢复、有符号 Unicode 单元和 surrogate pair;测试不同 ucN 值对应普通 ANSI fallback、转义 control symbol、带终止分隔空格的 control word,以及带参数和完整原始 payload 的 binN。增加 opening/closing group brace 在 fallback 计数耗尽前出现的案例,断言跳过必须在括号前停止并继续正常 group 处理。另测字体切换/代码页、未知 starred destination、同时有 instruction/result 的 field、隐藏文字、含括号样式字节的二进制跨度、截断 binN、无效组闭合、超大输入和取消。分别比较抽取值、遗漏项、来源身份及原始字节未变化。Microsoft Open Specifications 的原始纯文本抽取算法仅用于 Exchange RTF 封装场景,不能作为通用 RTF reader 合同。本文是受测子集方法,不声称 Cove 导入 RTF。
旧 RTF 备注包含 Unicode 和嵌入字段
用户选择的 RTF 备注混合中文、补充平面符号、嵌套字体组、带缓存结果的 field instruction,以及含似大括号字节的图片 destination。简单文本 dump 重复了 fallback 字符,也把控制元数据泄漏进 prompt。
决策
用固定 parser、声明文本 destination profile,正确维护 Unicode/代码页状态,有界跳过二进制内容,并将字段保持惰性;模型使用前展示可复核投影。
预期结果
应用能准确说明哪些来源文字被包含或排除,保留原文,并对不支持内容明示限制,而不假装完整渲染 RTF。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- ANDROID-RTF-TEXT-EXTRACTION-2026-10:专用事实卡记录所选 RTF 解析器的 Unicode、group、destination 和 binary-span 契约;不声称 Android 内置支持或 Cove 已导入。
- RAG-01:本地 AI 管线各阶段需分别验证;该事实不定义 RTF 语法。
- ANDROID-PRIVACY-01:用户文档的访问、存储及是否送入后续本地任务由应用负责。
任务质量需要有版本记录的语料和验收规则;流畅的单条样例不等于准确度结果。
实施流程
- 选择真实解析库和支持子集. 记录 parser artifact/version 和 Android 实际运行路径。定义可接受的 RTF 版本、destination、表格、字段及错误行为;不能凭扩展名推断支持,也不能写只剥大括号的 parser。
- 维护 group、代码页和 Unicode 状态. 测试嵌套状态恢复、活动字体/代码页、有符号 UTF-16 单元、surrogate pair 以及 ucN ANSI fallback 单位。control word/symbol 各算一单位,终止分隔空格不算;binN 与参数及完整 payload 算一单位,同时跳过 N 个原始字节;遇到 group 大括号时先停止 fallback 跳过,再正常处理括号。
- 安全限制并跳过二进制跨度. 读取 binN 前校验声明长度和偏移溢出,设置上限并在截断时失败。跨度中的字节须当作不透明 payload,避免其括号或反斜线改变组结构。
- 制定 destination 和 field 策略. 仅选择获准文本 destination;未知 starred group 按整体跳过;绝不执行字段指令、链接或嵌入对象。明确隐藏文字和缓存字段结果的处理。
- 审阅带来源信息的投影. 保留来源身份、解析器版本、已选 destination、解码警告和完整性状态。限制资源,显示纳入/省略内容,并确认成功或失败后原文件都没有改变。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 声明准确 parser、支持的 RTF profile、destination 规则及不支持时行为;不假设 Android 内置通用解析支持。
- 嵌套 group 状态、活动 code page/font、有符号 UTF-16 单元和 surrogate pair 均有独立夹具;ucN 测试按 ANSI fallback token(非 grapheme/字节)计数、不计终止空格、将 binN 作为一个单位并另跳过 N 个 payload 字节、在组括号前停止,并验证作用域恢复。
- binN 使用溢出安全的字节边界;跨度内的括号/控制词样式字节不能破坏语法解析。
- 未知 starred destination、fields、隐藏文字和嵌入对象均有明确惰性纳入/排除规则。
- 投影保留来源/parser provenance 和资源限制;原文未变,也不声称 Cove 有 RTF 导入功能。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| RTF 主文本投影 | 使用固定 parser 和明确 destination/代码页规则。 | 恢复声明支持的文本视图,但不声称完整布局、字段执行或所有 destination 都已覆盖。 |
| DOCX 修订视图 | 对 WordprocessingML 修订部分选择 original/proposed/review 投影。 | 修订 markup 是 package 级合同,不定义 RTF group 或 Unicode fallback 解析。 |
| EML MIME 正文解码 | 选择 MIME part,先 transfer-decode 字节再按 charset 解码。 | MIME 分界/传输编码不同于 RTF 控制词组和 destination 语义。 |
| 剥离大括号文本 | 不要把它作为抽取方法。 | 嵌套组、作用域状态、转义语法和原始二进制跨度无法用分隔符解决。 |
需要避免的失败模式
- 用正则或大括号计数器剥离 RTF 控制语法。
- 把 ucN 误当原始字节数,或将 UTF-16 surrogate pair 当单个 16 位值。
- 让 binN 内似括号字节影响组解析,或不限制声明长度。
- 执行 field 指令、泄露隐藏文字,或把 Exchange 专用规范泛化为所有 RTF。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Android privacy and security
- Microsoft — Rich Text Format Specification 1.9.1
- Microsoft Learn — Exchange RTF 封装中的原始纯文本抽取
- Unicode Consortium — Unicode 16.0 核心规范:UTF-16 与 surrogate
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
ucN 究竟计什么,遇到 group 大括号怎么办?
它计 ANSI fallback 单位,不计 Unicode grapheme cluster 或源文件字节。control word/symbol 各一单位,结束 control word 的分隔空格不算;binN 连同参数及完整 payload 算一单位,同时仍跳过声明的原始 payload 字节数。若计数未耗尽就遇到组大括号,应停止 fallback 跳过并正常处理大括号。
binN 中的大括号会结束 RTF group 吗?
不会。binN 声明原始字节跨度,紧随其后的准确字节数都是 payload。恢复语法前先检查边界并按不透明数据跳过。
Exchange RTF 抽取算法定义了所有 RTF reader 吗?
没有。所引 MS-OXRTFEX 原文抽取步骤用于 Exchange RTF 封装内容。通用 RTF 导入仍需实际解析库与声明过的支持 profile。
是否应包含每个看似文本的 field 或隐藏 run?
不应自动包含。字段指令可能包含外部引用,隐藏/destination 文本也可能不同于主正文。定义可复核的纳入/排除策略并保留来源。