我正在使用 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(不是)刷新缓冲区的问题。还是我做错了什么?
谢谢您的回答。