2014-02-21 91 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字節)。