Perl rtf文件中的编码类型错误

Perl rtf文件中的编码类型错误,perl,rtf,Perl,Rtf,我正在尝试读取rtf文件并提取其中的字符。 例如,下面是ф的rtf版本 {\rtf1\ansi\ansicpg1252\fromtext\fbidis\deff0{\fonttbl {\f0\fswiss\fcharset0 Arial;}{\f1\fmodern Courier New;} {\f2\fnil\fcharset2 Symbol;}{\f3\fmodern\fcharset0 Courier New;} {\f4\fswiss\fcharset204 Arial;} {\colo

我正在尝试读取rtf文件并提取其中的字符。 例如,下面是ф的rtf版本

{\rtf1\ansi\ansicpg1252\fromtext\fbidis\deff0{\fonttbl {\f0\fswiss\fcharset0 Arial;}{\f1\fmodern Courier New;} {\f2\fnil\fcharset2 Symbol;}{\f3\fmodern\fcharset0 Courier New;} {\f4\fswiss\fcharset204 Arial;} {\colortbl\red0\green0\blue0;\red0\green0\blue255;} \uc1\pard\plain\deftab360\f0\fs20\htmlrtf{\f4\fs20\htmlrtf0 \'f4\htmlrtf\f0}\htmlrtf0\par}

正如您可以看到的,这是Windows-1252中的编码

#!/usr/bin/perl
use strict;
use utf8;
use Encode qw(decode encode);

binmode(STDOUT, ":utf8");
my $runtime = chr(0x0444);
   print "theta || ".$runtime." ||";

  my $hexstr = "0xF4";
  my $num = hex $hexstr;
  my $be_num = pack("N", $num);
  $runtime = decode( "cp1252",$be_num);
  print "\n".$runtime."\n";

$runtime = decode( "cp1251",$be_num);
  print "\n".$runtime."\n"
输出

theta || ф ||
ô

ф

正如你所看到的,使用cp1252,我得到了更多。我错过什么了吗?我想从rtf中获取编码。我希望打印ф,但它打印了ô

,而文档的全局代码页是cp1252。有本地定义:

  • \xf4字符是用字体f4:
    {\f4…\'f4
    编写的
  • 但是字体f4的定义是:
    {\f4\fswiss\fcharset204 Arial;}
  • \fcharset204将此字体的字符集设置为204,例如俄语,即代码页1251(根据)
使用代码页1251,您可以得到预期的字符ф


顺便说一句,代码页1252类似于拉丁语-1,完全没有字符ф(请参见)

当文档的全局代码页为cp1252时,有一些本地定义:

  • \xf4字符是用字体f4:
    {\f4…\'f4
    编写的
  • 但是字体f4的定义是:
    {\f4\fswiss\fcharset204 Arial;}
  • \fcharset204将此字体的字符集设置为204,例如俄语,即代码页1251(根据)
使用代码页1251,您可以得到预期的字符ф


顺便说一句,代码页1252类似于拉丁语-1,完全没有字符ф(请参见)

Re“正如您可以看到的那样,使用cp1252我得到了ô。我缺少什么吗?”显然,因为cp1252中的字符F4是ô。我无法告诉您缺少什么,因为我不知道RTF。除此之外:
my$be_num=pack(“N”,$num);
“\0\0\0\xF4”。要想得到
“\xF4”
,你需要
我的$be_num=pack(“C”,“num”);
我的$be_num=chr($num);
也可以。@ikegami如果你将上述数据保存在.rtf中,你会得到一个ф。我想知道它为什么要打印ф。它应该打印ôRe”如果您将上述数据保存在.rtf中,您将得到一个ф。我想知道为什么它会打印ф。“,我知道,但我不知道rtf,所以我无法帮助您。对于“它应该打印”,出于同样的原因,我无法确认或否认。我所能做的就是确认您从Perl脚本中获得了正确的输出,所以我所做的就是这样。Re”正如你所看到的,在cp1252中,我得到了ô。我丢失了什么吗?“显然,因为cp1252中的字符F4是ô。我不能告诉你你丢失了什么,因为我不知道RTF。旁白:
my$be_num=pack(“N”,“num”);
产生
“\0\0\xF4”
。要想得到
“\xF4”
,你需要
my$be_num=pack(“C”)“,$num);
我的$be_num=chr($num);也可以。@ikegami如果你把上面的数据保存在.rtf中,你会得到一个ф。我想知道为什么它会打印ф。它应该打印ôRe“如果你把上面的数据保存在.rtf中,你会得到一个ф。我想知道,但我不知道rtf,所以我不能帮上忙。Re”应该打印ô,出于同样的原因,我无法确认或否认。我所能做的就是确认您从Perl脚本中获得了正确的输出,所以我所做的就是这样。谢谢@steffen ullrich这真的很有帮助。谢谢@steffen ullrich这真的很有帮助。