转义的双字节/多字节字符的RTF转换

时间:2015-04-08 13:43:48

标签: python perl unicode rtf utf

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

这些转义的编码字符出现:

\'a1\'dd

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

我在EUC-CN =中文Windows = Mac OS中文简体编码字符集中找到了A1DD的匹配项,它正确识别了unicode符号U + 2265。

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

我已经广泛搜索了,但是很短暂;还有很多其他人有这方面的报道,但我还没有看到解决方案。我想用Perl / Python等编写一个处理这种转换的脚本,而不是依赖于可以读/写RTF格式的Windows工具。

2 个答案:

答案 0 :(得分:3)

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

Background

答案 1 :(得分:1)

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 ≥