输出文件的Perl(错误?)编码

时间:2014-02-21 10:02:58

标签: perl utf-8 character-encoding latin1

我在Windows 7(32位)上运行Active Perl 5.16.3。

我的(短)程序按摩输入文本文件(以UTF-8编码)。我希望输出编码在Latin1中,所以我的代码是:

open (OUT, '>;encoding(Latin1)', "out.txt") || die "Cannot open output file: $!\n";
print OUT "$string\n";

但结果文件仍然是UTF-8。我做错了什么?

1 个答案:

答案 0 :(得分:2)

首先,编码层通过冒号而不是分号与开放模式分开。

open OUT, '>:encoding(latin1)', "out.txt" or die "Cannot open output file: $!\n";

其次,Latin-1只能编码UTF-8的一小部分。此外,该编码的大部分在两种编码中编码相同。因此,我们必须使用具有不编码相同字符的测试文件,例如, \N{MULTIPLICATION SIGN} U + 00D7 ×,在Latin-1中为\xD7,在UTF-8中为\xC3\x97

确保您实际解码输入文件。

以下是生成测试文件的方法:

$ perl -CSA -E'say "\N{U+00D7}"' > input.txt

以下是测试您是否正确重新编码文件的方法:

use strict;
use warnings;
use autodie;

open my $in, "<:encoding(UTF-8)", "input.txt";
open my $out, ">:encoding(latin1)", "output.txt";

while (<$in>) {
    print { $out } $_;
}

input.txtoutput.txt之后应该有不同的长度(3个字节→2个字节)。