2012-02-15 2 views
4

Windows 7에서 Active Perl 5.14를 실행하고 있습니다. 변환 테이블을 읽어 들인 후 파일에서 작업하고 다른 패턴으로 바꾸는 프로그램을 작성하려고합니다. 패턴 - 위의 모든 것은 유니 코드 (UTF-8)로되어 있습니다.Perl + 유니 코드 : "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 ... 

그것은이 시점에서, 그것이라고 밝혀 다음은 프로그램의 시작인가? 유니 코드 문자열을 올바르게 처리하고, 디코딩하고, 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

감사합니다. 이로 인해 디버거에서 "와이드 문자"오류가 해결되었습니다. 하지만 이제는 프로그램에 더 많은 문제가 있습니다. 유니 코드 문자를 제대로 처리하지 못하는 것 같습니다.이 질문을 계속해야하는지 아니면 새 질문을 열어야하는지 궁금합니다. –

+0

새 질문을 엽니 다. 이것은 포럼 토론이 아니라 Q & A 사이트입니다. 여러 질문을 하나의 질문으로 결합하면 나중에 동일한 대답을 찾는 사람들을 혼란에 빠뜨릴 수 있습니다. – mpeters

+0

OK, I는 해결책으로이 응답을 표시하고 새 질문을 엽니 다. –

0

나는 문제는 당신이 우리를 표시하지 않은 코드의 일부에 있다고 생각한다. 나는이 의문을 다음과 같은 사실에 근거합니다 :

  1. 당신이 인용 한 오류 메시지는 at (eval 155)라고 말합니다. 코드에는 eval이 없습니다.

  2. 우리에게 보여 당신이 위의 코드는 내가 입력이 유니 코드 문자가 포함 된 경우에도, 그것을 실행할 때 하지는 "와이드 문자"경고를 생산한다. 내가 생산할 수있는 유일한 방법은 use open 줄과 binmode STDOUT 줄을 모두 주석 처리하는 것입니다. 나는 리눅스에있어, 내 펄은 내가 (안 버전 요구 사항을 낮추고 unicode_strings feature을 해제했다는 것을 의미 만 v5.10.1입니다 :

가 인정 하듯이, 내 테스트 환경은 당신에 정확히 일치하지 않는 당신이 실제로 그것을 사용하고있다). 그래도 문제가 게시 한 코드에 없다고 생각합니다.

+0

분명히 평가는 디버거입니다 (저는 Padre에서 실행했습니다). 디버거없이 프로그램을 실행하면 다음과 같이 표시됩니다. 'name "main :: INPUT은 한 번만 사용됩니다. Conv.pl 라인 58에서 오타가 발생할 수 있습니다. "main :: CONVTABLE "이름은 한 번만 사용되었습니다. 오타가 발생할 수 있습니다. "main :: OUTPUT"은 한 번만 사용됩니다. Conv.pl 라인 71의 오타가 있습니다. 변환 테이블 : 시작 파일 : E : \ My Documents \ Perl \ Conversion 테이블.TXT ∩╗┐England, 독일 그는, 그녀 1, HOMHOM <╫ö╫ó╫¿╫│11><╫ö╫ó╫ £ ╫Ö╫ò╫ƒ> <╫ ù ╫Ö╫│ ╫ ¥><╫ù╫Ö╫Ö╫ ¥>' –

관련 문제