1

私は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(ではなく)がバッファをフラッシュする問題であるように私には思えます。それとも私は何か間違ったことをしていますか?

ご回答ありがとうございます。

4

1 に答える 1

5

問題は、<>複数の行を読み取る#encodingため、新しいディレクティブが表示される前に、次の行などが古いエンコーディングで解釈されていることです。

おそらく最善の策は、ファイルをバイナリモードで読み取り、Encodeモジュールを使用して現在のエンコーディングから各行をデコードすることです。

于 2011-03-14T23:44:00.483 に答える