2014-02-21 6 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"; 

둘째 라틴 1은 UTF-8의 작은 서브 세트를 인코딩 할 수있다. 또한이 하위 집합의 대부분은 두 인코딩에서 모두 동일하게 인코딩됩니다. 따라서 인코딩되지 않은 문자가 포함 된 테스트 파일을 사용해야합니다 (예 : \N{MULTIPLICATION SIGN} U + 00D7 ×이며 Latin-1에서는 \xD7이고 UTF-8에서는 \xC3\x97입니다.

실제로 입력 파일을 디코딩해야합니다.

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 나중에 다른이 있어야합니다

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

당신이 제대로 파일을 레코딩하는 것을 테스트 할 수있는 방법입니다 : 여기

는 테스트 파일을 생성 할 수있는 방법입니다 길이 (3 바이트 → 2 바이트).