在我拥有的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工具。
答案 0 :(得分:3)
RTF文件中用于'xx
字节转义的编码因字体而异。因此,在能够决定如何解码它们之前,您通常必须足够解析RTF以找到当前的\fcharset
定义。在这里你可能有fcharset 134又名代码页936又名GB。
答案 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 ≥