Python 如何正确解码RTF中的十六进制值

Python 如何正确解码RTF中的十六进制值,python,character-encoding,nlp,rtf,Python,Character Encoding,Nlp,Rtf,不幸的是,这一个有两个漏洞:文本编码和RTF。但是在这里 背景 我正在开发一个NLP文本管道,我们需要将RTF转换为纯文本,换句话说,我们需要删除RTF控制字符并保持文本内容不变。我们正在用python构建管道,它有几个要求,阻止我们在生产中使用ApacheTikka之类的东西 我知道,如果文档作者键入非ascii字符,RTF可以包含十六进制值,例如\'a9。我还知道文档中的第一个控制字符序列指定了如何解码这些十六进制值,例如\ansicpg1252。例如,在这种情况下,文档开头出现的\ansi

不幸的是,这一个有两个漏洞:文本编码和RTF。但是在这里

背景 我正在开发一个NLP文本管道,我们需要将RTF转换为纯文本,换句话说,我们需要删除RTF控制字符并保持文本内容不变。我们正在用python构建管道,它有几个要求,阻止我们在生产中使用ApacheTikka之类的东西

我知道,如果文档作者键入非ascii字符,RTF可以包含十六进制值,例如
\'a9
。我还知道文档中的第一个控制字符序列指定了如何解码这些十六进制值,例如
\ansicpg1252
。例如,在这种情况下,文档开头出现的
\ansicpg1252
意味着
\'a9
应被解释为unicode码点
00A9(版权标志)

问题: 我遇到一个RTF文档,第一组控制字符中有
\ansicpg1252
,但是文档中有几个地方出现了以下十六进制文字,
\'81'aa
。这令人困惑,因为
0x81
windows-1252
编码中未定义。我想它可能是
utf-8
,但是
utf-8
中也没有定义它

WordPad.exe用以下字符表示这两个字节:↑

Apache Tikka使用相同的字符,↑

此字符对应于unicode代码点
2191(向上箭头)
,而我们的神秘字节
0x81AA
,是使用包含日语字符的编码此字符的结果

作为参考,RTF文档中这两个字节的完整上下文是

\plain\f1\fs20 \'81\'aa\plain\f0\fs20
文档在
\fonttbl
组中包含此条目:

{\f1\fmodern\fcharset128\fprq1 MS Mincho;}
据我所知,这意味着
\f1
之后的任何文本都应该使用
MS Mincho
字体来呈现,这是有意义的,因为
MS Mincho
包含日语字形。但是RTF解析器如何知道应该使用
Windows代码页932
而不是文件第一行中指定的
ansicpg1252
来解码
0x81AA
?我需要知道某些字体意味着某些编码吗


我最好的猜测是它与
\fonttbl
条目中的
\fcharset128
部分有关,但我不确定。

在发表评论后,我做了更多的挖掘

fcharset
参数来自一组固定的值,这些值映射到所使用的编码。下面是一个例子:


从内存中,我想我从微软的RTF规范文档()中找到了这些文件。

你有完整的示例文件吗?我想验证RTF解析器工具包()是否正确地处理它。。。如果是这样的话,跟踪编码是如何确定的应该是很简单的。不幸的是,这是医学文本,所以我不会发布它。但是你答案中的链接非常好。正是我想要的。谢谢