2012-02-15 7 views
4

Windows 7でActive Perl 5.14を実行しています。 変換テーブルを読み込み、ファイルを処理して特定のパターンを他のものに置き換えるプログラムを作成しようとしていますパターン - 上のすべてをUnicode(UTF-8)で表します。ここではプログラムの先頭は次のとおりです。Perl + Unicode: "Wide Strings"エラー

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

なぜそれがある:?

#!/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 ... 

それは、この時点で、それが言うことが判明しますか私は、Unicode文字列を正しく処理し、デコードしてUTF-8にエンコードするために必要なすべての処方を実行し実装したと思いますか? それを修正するには?

TIA

ヘレン

+0

コードは問題ありません。デバッガの外で実行するとどうなりますか? – ikegami

+2

ところで、 'binmode STDOUT、 ':utf8';'は 'open qw <:std:utf8>;で同じことが行われて冗長です。 – ikegami

+2

ところで、 'use feature qw ;(そのコードには何の影響もありません)は冗長で、' use 5.014; 'で同じことが行われます。 – ikegami

答えて

5

PerlデバッガにはSTDOUTとは異なる独自の出力ハンドルがあります(最終的にはSTDOUTと同じ場所に行くことがあります)。スクリプトの冒頭近くで次のようなことをしたい場合もあります。

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

ありがとうございました。これにより、デバッガでの「ワイド文字」エラーが解決されました。しかし、今、私はプログラムとのさらなる問題を抱えている - 正しくUnicode文字を処理していないようだ - 私はこの質問を続けるか、新しい –

+0

開きます新しいものを開く必要があるのだろうか。これはフォーラムディスカッションではなく、Q&Aサイトです。複数の質問を1つにまとめると、後で同じ回答を探す人が混乱するだけです。 – mpeters

+0

OK、この回答を解決策としてマークし、新しい質問を開きます。 –

0

私はこの問題は、あなたが私たちに示されていないコードの一部であることを疑います。私は、次のような事実上、この疑惑をベース:あなたが引用

  1. エラーメッセージがat (eval 155)言います。あなたのコードにはevalがありません。

  2. は私たちに示しています上記のコードは、私が入力にUnicode文字が含まれている場合でも、それを実行したときにないは「ワイド文字」の警告を生成しません。私がそれを作ることを可能にする唯一の方法は、use openbinmode STDOUTの両方の行をコメントアウトすることです。私はLinux上だし、私のPerlは、私は(ないバージョン要件を下げ、unicode_strings featureをオフにしなければならなかったことを意味し、唯一のv5.10.1です:

は確かに、私のテスト環境はあなたに全く同じではありませんあなたが実際にそれを使用しているということです)。それでも、あなたが投稿したコードに問題がないと私は非常に思っています。

+0

明らかに、評価はデバッガにあります(私はPadreの下で実行しています)。 'name" main :: INPUTは一度だけ使用されています:Conv.pl行58のtypoです。 "main :: CONVTABLE"という名前は一度だけ使用されています:typo "main :: OUTPUT"は一度だけ使用されました。Conv.pl行71の可能性があります。 変換テーブル:開始ファイル:E:\ My Documents \ Perl \ Conversionテーブル。TXT ∩╗┐England、ドイツ 彼、彼女 、HOMHOM <╫ö╫ó╫¿╫│11><╫ö╫ó╫£╫Ö╫ò╫ƒ> <╫ ù╫Ö╫│╫¥><╫ù╫Ö╫Ö╫¥> ' –