4

PC UTF-8 でエンコードされたファイルがあります。ファイルを PC ANSI に変換したいと考えています。

以下を試しましたが、常に出力ファイルが PC UTF-8 になります。

use Encode;

$infile = $ARGV[0];
open(INFILE, $infile);

my $outfile = "temp.txt";

open(OUTFILE, ">$outfile");

while(<INFILE>) {
  my $row = $_;
  chomp $row;

  $row = Encode::encode("Windows-1252", $row);
  print OUTFILE $row."\n";

}

close INFILE;
close OUTFILE;
4

2 に答える 2

10

問題は、エンコードしたデータを決してデコードしないことです。

use strict;
use warnings;
use Encode qw( encode decode );

open(my $INFILE,  '<', $ARGV[0]) or die $!;
open(my $OUTFILE, '>', $ARGV[1]) or die $!;

while (my $utf8 = <$INFILE>) {
   my $code_points = decode('UTF-8', $utf8);    # <-- This was missing.
   my $cp1252 = encode('cp1252', $code_points);
   print $OUTFILE $cp1252;
}

しかし、これをもう少し簡単に行うことができます。

use strict;
use warnings;

open(my $INFILE,  '<:encoding(UTF-8)',  $ARGV[0]) or die $!;
open(my $OUTFILE, '>:encoding(cp1252)', $ARGV[1]) or die $!;

while (<$INFILE>) {
   print $OUTFILE $_;
}
于 2013-02-25T23:24:14.673 に答える
1

デコードとエンコードを手動で行う代わりに、PerlIO-Layers を使用する必要があります。binmode関数を使用して、または three-arg のモード引数でレイヤーを指定できますopen

use strict; use warnings;
use autodie;

open my $INFILE,  '<:utf8',                 $ARGV[0];
open my $OUTFILE, '>:encoding(iso-8859-1)', "temp.txt";
#                   ^-- the layers

while (my $line = <$INFILE>) {
  print $OUTFILE $line;
}

Perl はデフォルトではファイルを UTF8 で開かないことに注意してください。また、デコード レイヤーも指定する必要があります。レイヤーは、直接:encoding(utf8)言うことができるほど一般的です。:utf8

利用可能なすべてのエンコーディングをリストすることができます

use Encode;
print "$_\n" for Encode->encodings();
于 2013-02-25T22:02:32.947 に答える