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