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";
}

如果我在函数前添加更多注释,则所有字符都可以:

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 回答