【问题标题】:RTF conversion of escaped double-byte/multi-byte characters转义双字节/多字节字符的 RTF 转换
【发布时间】:2015-06-13 12:21:49
【问题描述】:

在我拥有的 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 字符集中找到了 A1DD 的匹配项,它可以正确识别 unicode 符号 U+2265。

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

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

【问题讨论】:

  • 很难看到没有完整文件的情况。你可能忽略了其中的某些内容。

标签: python perl unicode rtf utf


【解决方案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 ≥

【讨论】:

  • 非常有趣……这是 fcharset。有这么多字符集,我怎么知道哪一个被用于这段特定的代码? {\f0\fswiss\fcharset0 Arial;} {\f1\fmodern Courier New;} {\f2\fnil\fcharset2 Symbol;} {\f3\fmodern\fcharset0 Courier New;} {\f4\fswiss\fcharset134 Simsun;}}
  • 没关系,我想通了。 \htmlrtf{\f4\fs24\htmlrtf0 \'a1\'dd
  • 我不知道 RTF,但看起来它正在创建稍后将使用的定义
【解决方案2】:

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

Background

【讨论】:

  • 谢谢!是的,你是对的 fcharset,见下文。
猜你喜欢
  • 2019-04-12
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多