转义 double-byte/multi-byte 个字符的 RTF 转换

RTF conversion of escaped double-byte/multi-byte characters

在我拥有的 RTF 文件中(字符编码 ansicp1251)

这些转义编码字符出现:

\'a1\'dd

当我在 RTF 编辑器中打开它时,它正确打开为 unicode 符号 U+2265 。在 RTF 文档中,它将这些转义字符列为十六进制代码。但是,将其列为 hex(A1) + hex(DD) 是不正确的,因为它们代表两个不同的字符,而我只想要 unicode U+2265 .

的一个字符

我在 EUC-CN = Chinese Windows = Mac OS Chinese Simplified Encoding charset 中找到了 A1DD 的匹配项,它正确识别了 unicode 符号U+2265.

但是,此编码未在文件中的任何位置列出,我不确定我的 RTF 查看器如何知道我不想要 hex(A1) + hex(DD) 而我确实想要这个双字节字符。

我在谷歌上进行了广泛的搜索,但没有找到答案;还有很多其他人对此有报告,但我还没有看到解决方案。我想用 Perl/Python 等编写一个脚本来处理这种转换,而不依赖于可以 read/write RTF 格式的 Windows 工具。

RTF 文件中用于 'xx 字节转义的编码因字体而异。因此,您通常必须充分解析 RTF 以找到当前的 \fcharset 定义,然后才能决定如何解码它们。在这里你可能有 fcharset 134 又名代码页 936 又名 GB。

Background

decode($encoding, $bytes)就是用来进行这种转换的。

不是cp1251。

$ perl -E'
   use open ":std", ":encoding(UTF-8)";
   use Encode qw( decode );
   my $bytes = join "", map chr(hex($_)), qw( a1 dd );  # "\xA1\DD"
   say sprintf "U+%v04X %1$s", decode($ARGV[0], $bytes);
' cp1251
U+040E.042D ЎЭ

您需要从文档中获取正确的编码。可以是euc-cn.

$ perl -E'
   use open ":std", ":encoding(UTF-8)";
   use Encode qw( decode );
   my $bytes = join "", map chr(hex($_)), qw( a1 dd );  # "\xA1\DD"
   say sprintf "U+%v04X %1$s", decode($ARGV[0], $bytes);
' euc-cn
U+2265 ≥

不过cp936的可能性更大

$ perl -E'
   use open ":std", ":encoding(UTF-8)";
   use Encode qw( decode );
   my $bytes = join "", map chr(hex($_)), qw( a1 dd );  # "\xA1\DD"
   say sprintf "U+%v04X %1$s", decode($ARGV[0], $bytes);
' cp936
U+2265 ≥