【问题标题】:Perl: Problem with changing encoding in the middle of reading a filePerl:在读取文件的过程中更改编码的问题
【发布时间】:2011-03-14 23:00:06
【问题描述】:

我正在使用 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";
}

如果我在函数前多放一些cmets,所有字符都OK:

sub macro5_fn {
  print "žluťoučký kůň úpěl ďábelské ódy\n";
}

简单地说,正确解码的字符数取决于这些字符与#encoding指令的距离,靠近的字符解码不正确。

在我看来,这是 Perl 和 PerlIO(不是)刷新缓冲区的问题。还是我做错了什么?

感谢您的回答。

【问题讨论】:

  • 也许我应该提到所有的宏都是用open($file_handle, '&lt;', $macro_name)打开的,然后通过调用change_encoding($fh,"utf8")设置为默认编码
  • 您是否尝试过将句柄保持在字节模式,然后使用$chars = Encode::decode($encoding, $bytes) 解码为正确的字符格式?这应该回避任何缓冲问题。

标签: perl encoding binmode


【解决方案1】:

问题在于&lt;&gt; 读取的不仅仅是一行,因此在您看到新的#encoding 指令之前,下一行左右正在旧编码下被解释。

您最好的选择可能是以二进制模式读取文件并使用编码模块从当前编码解码每一行。

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2014-03-12
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2014-01-05
    相关资源
    最近更新 更多