不幸的是,这个有两个漏洞,文本编码和 RTF。但它在这里。
我正在研究 NLP 文本管道,我们需要将 RTF 转换为纯文本,换句话说,我们需要删除 RTF 控制字符并保持文本内容不变。我们正在用 python 构建管道,它有几个要求阻止我们在生产中使用 Apache Tikka 之类的东西。
我知道 RTF 可以包含十六进制值,例如\'a9
文档的作者是否键入了非 ascii 字符。我也知道文档中的第一个控制字符序列指定了如何解码这些十六进制值,例如\ansicpg1252
. 例如,在这种情况下,存在\ansicpg1252
在文档装置,其开头\'a9
应该被解释为Unicode代码点00A9 (COPYRIGHT SIGN)
按所述窗口1252的编码。
我遇到了一个带有\ansicpg1252
第一组控制字符的 RTF 文档,但是文档中有几个地方出现了以下十六进制文字,\'81\'aa
. 这是令人困惑的,因为0x81
在windows-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
,但我不确定。
呼啦一阵风
相关分类