잘못된 UTF-8이 포함 된 파일 (유효한 UTF-8이 포함되어 있음)을 읽을 때 경고 메시지를 인쇄하려고합니다. 그러나 유효하지 않은 데이터가 파일 끝에 있으면 경고를 출력 할 수 없습니다. 다음 MVCE는 무효 UTF-8 데이터를 포함하는 파일을 생성한다 (파일의 생성을 일반적인 질문이 단지 MVCE을 생성하기 위해 여기 첨가 관련이없는)파일 끝에 잘못된 형식의 UTF-8을 감지하는 방법은 무엇입니까?
가use feature qw(say);
use strict;
use warnings;
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
my $bytes = "\x{61}\x{E5}\x{61}"; # 3 bytes in iso 8859-1: aåa
test_read_invalid($bytes);
$bytes = "\x{61}\x{E5}"; # 2 bytes in iso 8859-1: aå
test_read_invalid($bytes);
sub test_read_invalid {
my ($bytes) = @_;
say "Running test case..";
my $fn = 'test.txt';
open (my $fh, '>:raw', $fn) or die "Could not open file '$fn': $!";
print $fh $bytes;
close $fh;
my $str = '';
open ($fh, "<:encoding(utf-8)", $fn) or die "Could not open file '$fn': $!";
$str = do { local $/; <$fh> };
close $fh;
say "Read string: '$str'\n";
}
출력은 :
Running test case..
utf8 "\xE5" does not map to Unicode at ./p.pl line 22.
Read string: 'a\xE5a'
Running test case..
Read string: 'a'
마지막 테스트 케이스에서 파일 끝에있는 유효하지 않은 바이트는 PerlIO 레이어 :encoding(utf-8)
에 의해 자동으로 무시됩니다.
파일을 작성하는 코드 부분은 설명하려는 일반적인 문제의 일부가 아닙니다. [MCVE] (http://stackoverflow.com/help/mcve)를 만들기 위해 방금 추가되었습니다. 파일 자체를 변경하거나 동일한 파일 이름으로 다시 쓸 수 없다고 가정 할 수 있습니다. –