Perl + Unicode: ошибка "широких строк" - PullRequest
4 голосов
/ 15 февраля 2012

Я использую Active Perl 5.14 в Windows 7. Я пытаюсь написать программу, которая будет считывать таблицу преобразования, затем работать с файлом и заменять определенные шаблоны другими шаблонами - все это в 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 ]

5 голосов
/ 16 февраля 2012

Отладчик Perl имеет свой собственный дескриптор вывода, отличный от STDOUT (хотя в конечном итоге он может пойти в то же место, что и STDOUT).Вы также захотите сделать что-то подобное в начале вашего скрипта:

binmode $DB::OUT, ':utf8' if $DB::OUT;
0 голосов
/ 15 февраля 2012

Я подозреваю, что проблема в некоторой части кода, которую вы нам не показали. Я основываю это подозрение на следующих фактах:

  1. В сообщении об ошибке, которое вы цитируете, написано at (eval 155). В вашем коде нет eval s.

  2. Код, который у вас есть , показанный нам выше, не выдает предупреждение «широкий символ», когда я его запускаю, даже если ввод содержит символы Unicode. Единственный способ сделать это - закомментировать и строку use open и строку binmode STDOUT.

По общему признанию, моя среда тестирования не совсем идентична вашей: я работаю в Linux, а мой Perl - только v5.10.1, что означает, что мне пришлось снизить требования к версии и отключить функцию unicode_strings (не то, что вы на самом деле используете его). Тем не менее, я очень подозреваю, что проблема не в коде, который вы опубликовали.

...