gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:20:10 28 4
gpt4 key购买 nike

不幸的是,这个问题遇到了两个问题:文本编码和 RTF。但它就在这里。

背景

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

我知道如果文档作者键入了非 ascii 字符,RTF 可以包含十六进制值,例如 \'a9。我还知道文档中的第一个控制字符序列指定如何解码这些十六进制值,例如\ansicpg1252。例如,在本例中,文档开头出现 \ansicpg1252 意味着 \'a9 应解释为 unicode 代码点 00A9 (COPYRIGHT SIGN ) 按照the windows-1252 encoding .

问题

我遇到了一个 RTF 文档,其第一组控制字符中包含 \ansicpg1252,但是文档中的多个位置出现了以下十六进制文字:\'81\' aa。这很令人困惑,因为 0x81windows-1252 编码中未定义。我认为它可能是 utf-8,但它也没有在 utf-8 中定义。

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

Apache Tikka 使用相同的字符,↑

这个字符对应于unicode代码点2191(向上箭头),事实证明我们的神秘字节0x81AA是使用Windows Code Page 932 encoding ,其中包含日语字符。

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

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

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

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

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

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

最佳答案

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

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 )

关于python - 如何正确解码 RTF 中的十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54698294/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com