猿问

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

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

背景

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

我知道 RTF 可以包含十六进制值,例如\'a9文档的作者是否键入了非 ascii 字符。我也知道文档中的第一个控制字符序列指定了如何解码这些十六进制值,例如\ansicpg1252. 例如,在这种情况下,存在\ansicpg1252在文档装置,其开头\'a9应该被解释为Unicode代码点00A9 (COPYRIGHT SIGN)所述窗口1252的编码

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

WordPad.exe 用这个字符代表这两个字节:↑

Apache Tikka 使用同一个字符,↑

这个字符对应于 unicode code point 2191 (Upwards Arrow),而且我们的神秘字节 ,0x81AA是使用包含日语字符的Windows 代码页 932 编码对这个字符进行编码的结果。

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

\plain\f1\fs20 \'81\'aa\plain\f0\fs20

并且文档在\fonttbl组中包含此条目:

{\f1\fmodern\fcharset128\fprq1 MS Mincho;}

据我了解,这意味着后面的任何文本\f1都应该使用该MS Mincho字体呈现,这是有道理的,因为MS Mincho包含日语字形。但是 RTF 解析器如何知道0x81AA应该使用Windows Code Page 932而不是ansicpg1252文件第一行中指定的方式进行解码?我需要知道某些字体暗示某些编码吗?

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


慕容3067478
浏览 289回答 1
1回答

呼啦一阵风

发表评论后,我做了更多的挖掘......的fcharset参数来自固定的一组值,其映射到使用的编码的。下面是一个例子:https://github.com/joniles/rtfparserkit/blob/master/src/main/java/com/rtfparserkit/parser/standard/FontCharset.java从记忆中,我想我是从 Microsoft 的 RTF 规范文档 ( https://www.microsoft.com/en-us/download/details.aspx?id=10725 ) 中挑选出来的
随时随地看视频慕课网APP

相关分类

Python
我要回答