Perl + Word:学位符号出现在A-circumflex之前

时间:2013-02-07 15:58:10

标签: perl ms-word ole

我在Perl中生成一个Word文档,我想在我生成的文本中包含度数符号(°)。如果我像这样生成代码:

$cell .= qq/\xB0/;

这有效,并生成($cell 55的值):55°

然而,当我这样做时,perlcritic抱怨我,并建议我使用这种结构:

$cell .= qq/\N{DEGREE SIGN}/;

这不起作用;它会产生:55°

查看perl -d中的代码,我看到运行以下代码:

my $cell = 55;
$cell .= qq/\N{DEGREE SIGN}/; # the PBP way
print sprintf("%x\n", ord($_)) for split //, $cell;

my $cell = 55;
$cell .= qq/\xB0/; # the non-PBP way
print sprintf("%x\n", ord($_)) for split //, $cell;

导致:

35
35
b0

我正在使用Win32::OLE

将文本输出到Word文档
my @column_headings = @{ shift $args->{'data'} };
my @rows            = @{ $args->{'data'} };

my $word   = Win32::OLE->new( 'Word.Application', 'Quit' );
my $doc    = $word->Documents->Add();
my $select = $word->Selection;

$csv->combine(@column_headings);
$select->InsertAfter( $csv->string );
$select->InsertParagraphAfter;
for my $row (@rows) {
    $csv->combine( @{$row} );
    $select->InsertAfter( $csv->string );
    $select->InsertParagraphAfter;
}
my $table = 
  $select->ConvertToTable( { 'Separator' => wdSeparateByCommas } );
$table->Rows->First->Range->Font->{'Bold'} = 1;
$table->Rows->First->Range->ParagraphFormat->{'Alignment'} =
  wdAlignParagraphCenter;
@{ $table->Rows->First->Borders(wdBorderBottom) }{qw/LineStyle LineWidth/}
  = ( wdLineStyleDouble, wdLineWidth100pt );
$doc->SaveAs( { 'Filename' => Cwd::getcwd . '/test.doc' } );

我能做些什么来摆脱无关的Â?

1 个答案:

答案 0 :(得分:1)

当然,您遇到了编码问题。度数符号为U+00B0,但此序列化为UTF-8 C2 B0,呈现为° - 如果此多字节字符被正确解码为utf-8。如果您将字节解码为单字节编码(例如... cp1252),则字节将被视为单独的,并显示Â °

现在显然,解决方案要么告诉Perl将unicode字符串转换为cp1252字符的字节字符串(恐怖!)。您会在这里找到my $bytestring = Encode::encode("cp1252", $string)函数。

或者你告诉文件它会认为自己是UTF-8。我不知道你会怎么做,但 是一个选项某处。这实际上是更可取的,因为有数千个字符(不像°)不适合cp1252。喜欢摄氏度(U + 2103)或华氏度(U + 2109)字符; - )