Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Трабл с кодировкой и Dumper


Автор: TTT 24.4.2007, 13:30
Вот листинг скрипта:
Код

#!perl -w
use strict;
use Tk;
require Tk::LabFrame;
use encoding 'cp1251';
use Data::Dumper;

my $VAR1 = {
            'comp' => [
                        {
                            'idx' => '1',
                            'name' => 'общество с ограниченной ответственностью "Смальта"',
                            'date' => '2007-04-20',
                            'code' => undef,
                            'country_code' => 'RU',
                            'percent' => '100'
                        }
                      ]
               };
Review();

sub Review{
    my $main = MainWindow->new(-title => 'REVIEW');
    my $fr = $main->Frame(-borderwidth => 2, -relief => 'raised')->pack(-padx => 10, -pady => 10);
    my $t = $fr->Text(width => 120, height => 40)->pack(-side => 'left');
    $main->Button(-text => 'Ok', -command => [$main => 'destroy'])
        ->pack(-side => 'right', -padx => 10, -pady => 10, -ipadx => 10, -ipady => 2);
    
    tie *STDOUT, ref $t, $t;
    print "Вот такой трабл\n";
    print Dumper($VAR1);
    
    MainLoop;
    return;
}

В файле скриншот результата выполнения (Dumper выводит '\x{43e}\x{431}\x{449}' вместо кириллицы). 
Видна перекодировка, которую делает Dumper.  Никак не могу получить кориллицу. 

Автор: TTT 24.4.2007, 14:26
Проблема решается перемещением use encoding 'cp1251'; в sub. Наверное конфликт модулей. 

Автор: TTT 25.4.2007, 09:30
Разобрался своими силами. В общем, все из-за use encoding 'cp1251';
Этой прагмой меняется системная кодировка. Делать сие не очень рекомендуют, можно нарваться на неприятности. Что со мной и произошло. Tk использует внутреннюю кодировку Unicode (для универсальности) и перекодирует из нее в сиситемную для отображения в  окнах. Скорее всего возникает нестыковка в таблицах перекодировки, ведь Data::Dumper тоже перекодирует. Символы '\x{43e}\x{431}\x{449}' возникают когда в таблицах Unicode нет соответствий. Я решил эту проблему использованием функций из модуля use Encode qw/encode decode/;
Привожу рабочий пример:
Код

#!perl -w
use strict;
use Tk;
use Encode qw/encode decode/;
use Data::Dumper;

my $VAR1 = {
            'comp' => [
                        {
                            'idx' => '1',
                            'name' => 'общество с ограниченной ответственностью "Смальта"',
                            'date' => '2007-04-20',
                            'code' => undef,
                            'country_code' => 'RU',
                            'percent' => '100'
                        }
                      ]
               };
Review();

sub Review{
    my $main = MainWindow->new(-title => 'REVIEW');
    my $fr = $main->Frame(-borderwidth => 2, -relief => 'raised')->pack(-padx => 10, -pady => 10);
    my $t = $fr->Text(width => 120, height => 40)->pack(-side => 'left');
    $main->Button(-text => 'Ok', -command => [$main => 'destroy'])
        ->pack(-side => 'right', -padx => 10, -pady => 10, -ipadx => 10, -ipady => 2);
    
    tie *STDOUT, ref $t, $t;
    print decode("cp1251", Data::Dumper->Dump([$VAR1]));
    
    MainLoop;
    return;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)