2014-11-24 5 views
2

여기서 궁극적으로 달성하려는 것은 파일의 모든 소문자를 대문자로 변환하여 터미널에 쓰는 것입니다.Perl : 파일에서 ÅÄÖ을 포함하는 텍스트 가져 오기

use utf8; 
binmode STDOUT, ":utf8"; 

$text = "ABCÅÄÖ\n"; 

$text =~ tr/A-Ö/a-ö/; 
print $text; 

출력은 :

abcåäö

예상대로.

하지만 파일에서 동일한 텍스트를 가져 오려고하면 모든 것이 엉망이됩니다.

use utf8; 
binmode STDOUT, ":utf8"; 

open FILE, $filename or die "An error occurred while reading the file: $!"; 
$text = join '', <FILE>; 
close FILE or die "An error occurred while closing the file: $!"; 

$text =~ tr/A-Ö/a-ö/; 
print $text; 

출력

ABCÃÃÃ

내가 가져온 텍스트가 제대로 인코딩되지 않은 있으리라 믿고있어. 누구든지 가져 오는 동안 텍스트를 인코딩하는 방법을 알고 있습니까?

미리 감사드립니다.

답변

3

를 사용 파일을 디코딩합니다.

use strict; 
use warnings; 

use utf8;        # Source code is UTF-8. 
use open ':std', ':encoding(UTF-8)'; # Terminal and files are UTF-8. 

my $qfn = ...; 

open(my $fh, '<', $qfn) 
    or die("Can't open file $qfn: $!\n"); 

my $text = do { local $/; <$fh> }; 
print(lc($text)); 
+0

이것은 tr과 all로 더 잘 작동했습니다. –

+0

'$ text = ~ tr/A-Ö/a-ö /'에 의존하는 것은 안전하지 않습니다. 'lc ($ text)'또는'$ text = ~ s/([A-ZÅÄÖ])/\ L $ 1/g'을 사용하십시오. 나는 다른 많은 개선점들을 만들었다. (globals 대신에 렉시 컬, 3-arg를 열고, 에러 메시지에 파일명을 포함해서 ...) – ikegami

1

그냥 파일을 인코딩하기에 무엇 펄 이야기 : 당신이 인코딩을 확인하려면,

open FILE, '<:utf8', $filename or die $!; 

또는, 당신은 펄을 말하지 않았다

open FILE, '<:encoding(UTF-8)', $filename or die $!; 
+0

이상한 ... 내가 가져 오기가 괜찮이 방법을 사용하는 경우 (IE 내가 텍스트 벌금을 인쇄 할 수 있습니다)하지만, 그것을 번역 할 때 Å A와 Ö 여전히 스크램블된다. –

+0

@ JackPettersson :'tr'보다는'lc'을 사용해보십시오. – choroba

+0

일했습니다. 고마워요! :) –

관련 문제