Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трабл с кодировкой и Dumper, Dump выводит '\x{43e}' вместо кириллицы 
V
    Опции темы
TTT
Дата 24.4.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Вот листинг скрипта:
Код

#!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 - 25.4.2007, 09:39

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  dumper.JPG 35,46 Kb
PM MAIL   Вверх
TTT
Дата 24.4.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



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

PM MAIL   Вверх
TTT
Дата 25.4.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Разобрался своими силами. В общем, все из-за 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;
}


Это сообщение отредактировал(а) TTT - 25.4.2007, 09:31
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0394 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.