我在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' } );
我能做些什么来摆脱无关的Â?
答案 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)字符; - )