Perl + Unicode:“宽字符串”错误

时间:2012-02-15 19:29:22

标签: perl unicode utf

我在Windows 7上运行Active Perl 5.14。 我正在尝试编写一个程序,它将读入转换表,然后处理文件并用其他模式替换某些模式 - 以上所有的Unicode(UTF-8)。这是该计划的开始:

#!/usr/local/bin/perl
# Load a conversion table from CONVTABLE to %ConvTable.
# Then find matches in a file and convert them.
use strict;
use warnings;
use Encode;
use 5.014;
use utf8;
use autodie; 
use warnings    qw< FATAL  utf8     >;
use open        qw< :std  :utf8     >;
use charnames   qw< :full >;
use feature     qw< unicode_strings >;

my ($i,$j,$InputFile, $OutputFile,$word,$from,$to,$linetoprint);
my (@line, @lineout); 
my %ConvTable;    # Conversion hash
print 'Conversion table: opening file: E:\My Documents\Perl\Conversion table.txt'."\n";
my $sta= open (CONVTABLE, "<:encoding(utf8)", 'E:\My Documents\Perl\Conversion table.txt');
binmode STDOUT, ':utf8';    # output should be in UTF-8
# Load conversion hash
while (<CONVTABLE>) {
    chomp;
    print "$_\n"; # etc ...
# etc ...

事实证明,在这一点上,它说:

wide character in print at (eval 155)E:/Active Perl/lib/Perl5DB.pl:640]line 2, <CONVTABLE> line 1, etc...

为什么?我想我已经完成并实施了所有必要的处方,以正确处理Unicode字符串,解码和编码成UTF-8? 以及如何解决它?

TIA

海伦

2 个答案:

答案 0 :(得分:5)

Perl调试器有自己的输出句柄,与STDOUT不同(尽管它最终可能与STDOUT位于同一位置)。您还希望在脚本开头附近执行类似的操作:

binmode $DB::OUT, ':utf8' if $DB::OUT;

答案 1 :(得分:0)

我怀疑问题出在您未向我们展示过的部分代码中。我的怀疑基于以下事实:

  1. 您引用的错误消息显示at (eval 155)。您的代码中没有eval

  2. 上面显示的代码 not 在运行时会产生“宽字符”警告,即使输入包含Unicode字符也是如此。我可以让它生成一个的唯一方法是注释掉 use open行和binmode STDOUT行。

  3. 不可否认,我的测试环境与你的测试环境不完全相同:我在Linux上,而我的Perl只是v5.10.1,这意味着我必须降低版本要求并关闭unicode_strings feature(不是你实际上正在使用它)。不过,我非常怀疑问题不在你发布的代码中。