無効なUTF-8が含まれているファイル(有効なUTF-8が含まれているはずです)を読むときに警告メッセージを表示しようとしています。ただし、無効なデータがファイルの最後にある場合は、警告を出力できません。出力されたファイルの最後に不正な形式の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";
}
:
次 MVCEは無効とUTF-8のデータを含むファイルを(ファイルの作成は一般的な質問には関係ありません、それは単にMVCEを生成するためにここに追加されました)を作成します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)を作成するように追加されました。ファイル自体を変更したり、同じファイル名に書き換えることはできません。 –