私はPerlを使用していくつかの「マクロ」ファイルをロードしています。ただし、これらのマクロはさまざまなエンコーディングでエンコードできるため、マクロを作成するユーザー向けに定義されたディレクティブがあります(つまり、
#encoding iso-8859-2
マクロの開始時)。
このディレクティブがマクロで検出されるたびに、関数設定エンコーディングが呼び出され、次のようになります。
sub change_encoding {
my ($file_handle, $encoding) = @_;
$file_handle->flush();
binmode($file_handle); # get rid of IO layers
binmode($file_handle,":encoding($encoding)");
}
問題は、標準を使用してマクロを読み取るときに
while($line = <$file_handle>){
process_macro($line);
}
「utf8"\xXY"はUnicodeにマップされません」というメッセージが表示されましたが、発音区別符号付きの文字が#encodingディレクティブの近くにある場合に限ります。いくつかの例を試しましたが、次のように、文字列の半分を\ xXYコードで、残りの半分を正しくデコードされた文字で取得することができました。
sub macro5_fn {
print "\xBElu\xBBou\xE8k\xFD k\xF9\xF2 úpěl ďábelské ódy\n";
}
関数の前にさらにコメントを付けると、すべての文字がOKになります。
sub macro5_fn {
print "žluťoučký kůň úpěl ďábelské ódy\n";
}
簡単に言うと、正しくデコードされる文字の数は、#encodingディレクティブからのこれらの文字の距離に依存し、近い文字は正しくデコードされません。
これはPerlとPerlIO(ではなく)がバッファをフラッシュする問題であるように私には思えます。それとも私は何か間違ったことをしていますか?
ご回答ありがとうございます。