转义 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 ≥
在我拥有的 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 ≥