0

我正在用 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' } );

我能做些什么来摆脱多余的东西?

4

1 回答 1

1

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

现在很明显,解决方案是告诉 Perl 将 unicode 字符串转换为 cp1252 字符的字节字符串(太可怕了!)。你会发现my $bytestring = Encode::encode("cp1252", $string)这里的功能很有趣。

或者您告诉文档它将认为自己是 UTF-8。我不知道你会怎么做,但必须在某个地方一个选项。这实际上更可取,因为有数千个字符(与°不同)不适合 cp1252。像摄氏度 ℃ (U+2103) 或华氏度 ℉ (U+2109) 字符;-)

于 2013-02-07T16:34:53.897 回答