共有三种 RTF,我不知道你有哪一种。 您可以通过在纯文本编辑器中打开文件来判断,或者只是使用less/more/cat/type/whatever 将其打印到您的终端。
首先,简单的案例:明文 RTF。
纯文本 RTF 文件以 {\rtf 开头,其中的所有文本都是(正如您所期望的)纯文本 - 尽管有时文本运行会使用格式化命令分成单独的运行 - 以\——在他们之间。由于所有格式化命令都是纯 ASCII,如果您将纯文本 RTF 从一个字符集转换为另一个字符集(只要两者都是 ASCII 的超集,如 cp949 和 utf-8 都是),它应该可以正常工作。
但是,该文件也可能有一个格式化命令,用于指定写入的字符集。该命令类似于\ansicpg949。当像写字板这样的 RTF 编辑器打开您的文件时,它会将您所有漂亮的 UTF-8 数据解释为 cp949 数据,并且除非您修复它,否则它会被 mojibake 搞砸。
解决此问题的最简单方法是找出您的编辑器想要为 UTF-8 文件放置的字符集。也许是\ansicpg65001,也许是\utf8,也许是完全不同的东西。所以只需将一个简单的文件保存为 UTF-8 RTF,然后用纯文本查看 it,看看它有什么代替 \ansicpg949,然后用右边的替换文件中的字符串一。 (请注意,代码页 65001 并不是真正 UTF-8,但它很接近,而且许多 Microsoft 代码都假定它们是相同的……)
此外,一些 RTF 编辑器(如 Apple 的 TextEdit)会转义任何非 ASCII 字符(例如,é 存储为 \'e9),因此无需转换。
最后,Office Open XML 包含一个用于称为 RTF 的 XML 规范,但实际上并不是一回事。我相信很多 RTF 编辑器都可以处理这个问题。幸运的是,您可以像对待纯文本 RTF 一样对待它——所有 XML 标记都有纯 ASCII 名称。
最简单的情况是压缩的纯文本 RTF。这是同一件事,但我相信是用 zlib 压缩的。或者它实际上可以是 .zip 存档中的 RTFD(可以是纯文本 RTF 以及单独文件中的图像和其他内容,或实际纯文本格式运行存储在单独文件中)。无论如何,如果你有其中之一,大多数Unix系统上的file命令应该能够将其检测为“压缩RTF”,此时我们可以弄清楚具体格式是什么并解压它,然后你就可以将其编辑为纯文本 RTF(或 RTFD)。
不用说,如果您不先解压缩此文件,您将不会在文件中看到任何您熟悉的文本 - 您很容易最终破坏它,因此无法解压缩,或者解压缩为垃圾, 通过将任意字节更改为不同的字节。
最后,困难的情况:二进制 RTF。
尽管它们已经过逆向工程,但它们的最早版本采用无证格式。以后的版本是公共规格。 Wikipedia 有规格链接。如果你想手动解析它,你可以,但它会是大量的代码,你将不得不自己编写。
更好的解决方案是使用one of the many libraries on PyPI,它可以将 RTF(包括二进制 RTF)转换为其他格式,然后您可以轻松编辑。