2014-02-21 53 views
0

我在Windows 7(32位)上运行Active Perl 5.16.3。输出文件的Perl(错误?)编码

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

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

尚未生成的文件仍处于UTF-8状态。我究竟做错了什么?

+3

你真的在打开模式字符串中有分号吗?它应该是冒号 - '>:encoding(Latin1)' – Borodin

回答

2

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

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

其次,Latin-1只能编码UTF-8的一小部分。此外,这两个编码中的大部分子集编码都相同。因此,我们必须使用一个测试文件,其中的字符不是编码相同的,例如\N{MULTIPLICATION SIGN} U + 00D7 ×,其为拉丁语-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字节)。