【问题标题】:Perl + Unicode: "Wide Strings" errorPerl + Unicode:“宽字符串”错误
【发布时间】:2012-03-07 04:21:47
【问题描述】:

我在 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

海伦

【问题讨论】:

  • 你的代码没问题。如果你在调试器之外运行它会发生什么?
  • 顺便说一下,binmode STDOUT, ':utf8'; 是多余的,use open qw&lt; :std :utf8 &gt;; 也是如此。
  • 顺便说一下,use feature qw&lt; unicode_strings &gt;;(对代码没有影响)是多余的,use 5.014; 也是如此。

标签: perl unicode utf


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这解决了调试器中的“宽字符”错误。但现在我的程序有更多问题 - 它似乎没有正确处理 Unicode 字符 - 我想知道我应该继续这个问题,还是打开一个新问题
  • 打开一个新的。这不是论坛讨论,而是问答网站。将多个问题组合成一个问题只会让后来寻找相同答案的人感到困惑。
  • 好的,我将这个答案标记为解决方案,并打开一个新问题。
【解决方案2】:

我怀疑问题出在您没有向我们展示的代码的某些部分。我的怀疑基于以下事实:

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

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

诚然,我的测试环境和你的不完全一样:我在Linux上,我的Perl只有v5.10.1,这意味着我不得不降低版本要求并关闭unicode_strings feature(不是你'实际上正在使用它)。不过,我非常怀疑问题不在您发布的代码中。

【讨论】:

  • 显然 eval 与调试器一起使用(我一直在 Padre 下运行它)。当我在没有调试器的情况下运行程序时,它说:Name "main::INPUT" used only once: possible typo at Conv.pl line 58. Name "main::CONVTABLE" used only once: possible typo at Conv.pl line 26. Name "main::OUTPUT" used only once: possible typo at Conv.pl line 71. Conversion table: opening file: E:\My Documents\Perl\Conversion table.txt ∩╗┐England, Germany he, she the, HOMHOM &lt;╫ö╫ó╫¿╫│11&gt; &lt;╫ö╫ó╫£╫Ö╫ò╫ƒ&gt; &lt;╫ù ╫Ö╫│ ╫¥&gt; &lt;╫ù╫Ö╫Ö╫¥&gt;
猜你喜欢
  • 2012-10-02
  • 2014-12-03
  • 1970-01-01
  • 2015-07-11
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多