【问题标题】:Perl Handling Malformed CharactersPerl 处理畸形字符
【发布时间】:2014-04-07 02:30:49
【问题描述】:

我想要关于 Perl 的建议。

我有想要用 Perl 处理的文本文件。这些文本文件以 cp932 编码,但由于某些原因,它们可能包含格式错误的字符。

我的程序是这样的:

#! /usr/bin/perl -w

use strict;
use encoding 'utf-8';

# 'workfile.txt' is supposed to be encoded in cp932
open my $in, "<:encoding(cp932)", "./workfile.txt";

while ( my $line = <$in> ) {

  # my process comes here

  print $line;

}

如果 workfile.txt 包含格式错误的字符,Perl 会抱怨:

cp932 "\x81" does not map to Unicode at ./my_program.pl line 8, <$in> line 1234.

Perl 知道它的输入是否包含格式错误的字符。所以我想重写以查看我的输入是好是坏并采取相应的行动,例如打印所有好的行(不包含格式错误的字符的行)以输出文件句柄 A,并打印包含格式错误的字符的行以输出文件句柄 B。

#! /usr/bin/perl -w

use strict;
use encoding 'utf-8';
use English;

# 'workfile.txt' is supposed to be encoded in cp932
open my $in, "<:encoding(cp932)", "./workfile.txt";

open my $output_good, ">:encoding(utf8)", "good.txt";
open my $output_bad,  ">:encoding(utf8)", "bad.txt";

select $output_good;   # in most cases workfile.txt lines are good

while ( my $line = <$in> ) {

  if ( $line contains malformed characters ) {

    select $output_bad;

  }

  print "$INPUT_LINE_NUMBER: $line";

  select $output_good;

}

我的问题是如何编写“if ($line contains malfoomed characters)”部分。如何检查输入的好坏。

提前致谢。

【问题讨论】:

  • 不要使用use encoding。越野车。已弃用。

标签: perl encoding


【解决方案1】:
#! /usr/bin/perl -w

use strict;

use utf8;                             # Source encoded using UTF-8
use open ':std', ':encoding(UTF-8)';  # STD* is UTF-8;
                                      #   UTF-8 is default encoding for open.
use Encode qw( decode );

open my $fh_in,   "<:raw", "workfile.txt"
   or die $!;
open my $fh_good, ">",     "good.txt"
   or die $!;
open my $fh_bad,  ">:raw", "bad.txt"
   or die $!;

while ( my $line = <$fh_in> ) {
   my $decoded_line =
      eval { decode('cp932', $line, Encode::FB_CROAK|Encode::LEAVE_SRC) };
   if (defined($decoded_line)) {
      print($fh_good "$. $decoded_line");
   } else {
      print($fh_bad  "$. $line");
   }
}

【讨论】:

  • ikegami san,非常感谢!我将使用eval 来查看是否存在格式错误的字符。阿里加托!
  • 我写的时候没有看 cp932 是什么。但我看到它是一种多字节编码。这意味着my $line = &lt;$fh_in&gt; 可能无法正常工作。
  • ikegami,我不够聪明,无法想到my $line = &lt;$fh_in&gt; 中断的情况,但我很高兴地报告说,我使用 eval 技术的程序可以完美地检测所有格式错误的数据。非常感谢!请注意,这在某些情况下可能不起作用。
  • 如果 0A 可以是换行符以外的字符的一部分,则会出现问题。我不知道这是否可能。
  • ikegami,再次感谢。格式错误的数据可能包含 0A,但到目前为止还不错。我注意到从文件句柄读取行可能会中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多