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)としてデコードしている場合、バイトは個別であると見なされ、を表示しますÂ °

明らかに、解決策は、Unicode文字列をcp1252文字のバイト文字列に変換するようにPerlに指示することです(ホラー!)。my $bytestring = Encode::encode("cp1252", $string)ここで興味深い関数が見つかります。

または、それ自体がUTF-8と見なされることをドキュメントに伝えます。どうすればいいのかわかりませんが、どこかにオプションが必要です。(°とは異なり)cp1252に適合しない文字が何千もあるため、これは実際には望ましいことです。摂氏℃(U + 2103)または華氏℉(U + 2109)の文字のように;-)

于 2013-02-07T16:34:53.897 に答える