Xpoint
   [напомнить пароль]

Какие-то странные глюки Tk

Метки: [без меток]
2007-05-03 06:58:37 [обр] Роман Чемисов(36/350)[досье]

Есть вот такой простенький скрипт, записанный в кодировке UTF8. Запускается он под Windows XP.

#!/usr/bin/perl -w  
use Tk;
use utf8;
use Encode qw(from_to is_utf8);
use strict;

my $filename = "";
my $mw = MainWindow->new;
    my $ent = $mw->Entry(
   -width => 20, 
   -textvariable => \$filename,
    );
    my $but = $mw->Button(-text => "Выбрать файл ...",
          -command => sub { fileDialog($mw, $ent, 'open')});
    $ent->pack(-side => 'left',-expand => 'yes', -fill => 'x');
    $but->pack(-side => 'left');
$mw->Button(
    -text    => 'Старт!',
    -command => sub { convert($filename)},
)->pack;
MainLoop;
sub convert {
    my ($file) = @_;
    $file =~ s{/}{\\}g;
#    print "String is UTF: ", is_utf8($file), "\n";
    &from_to($file, "utf8", "cp1251");
}
sub fileDialog {
    my $w = shift;
    my $ent = shift;
    my $operation = shift;
    my $types;
    my $file;
    my @types =
      (
       ["Excel",           [qw/.xls/]],
       ["Text files",           [qw/.txt .doc/]],
       ["Text files",           '',             'TEXT'],
       ["Perl Scripts",         '.pl',      'TEXT'],
       ["C Source Files",   ['.c', '.h']],
       ["All Source Files",     [qw/.tcl .c .h/]],
       ["Image Files",      '.gif'],
       ["Image Files",      ['.jpeg', '.jpg']],
       ["Image Files",      '',      [qw/GIFF JPEG/]],
       ["All files",      '*']
      );
    if ($operation eq 'open') {
   $file = $w->getOpenFile(-filetypes => \@types);
    } else {
   $file = $w->getSaveFile(-filetypes => \@types,
            -initialfile => 'Untitled',
            -defaultextension => '.txt');
    }
    if (defined $file and $file ne '') {
   $ent->delete(0, 'end');
   $ent->insert(0, $file);
   $ent->xview('end');
    }
}

Скрипт предлагает выбрать файл и потом парсит его.
Проблема в том, что если в имени выбранного файла содержатся кириллические символы, то выскакивает ошибка:

Tk::Error: Cannot decode string with wide characters at C:\Program Files\Perl\lib\Encode.pm line 186.
 Tk callback for .button1
......

Ошибка выскакивает в том месте, где я делаю from_to (это мне нужно для того, чтобы открыть выбранный файл).
Подскажите, в чём может быть дело? Кстати, is_utf8 выдаёт 1.

спустя 3 часа 20 минут [обр] Сергей Пантелеев(3/15)[досье]
Внимательно перечитайте perldoc Encode, чтобы понять, как работает perl с utf8, и обратите внимание на слово CAVEAT в описании from_to. Кратко: строка может быть записана в utf8 в двух видах. Первый - в виде wide characters (она же perl's internal form в мануале), многобайтных символов (в этом виде perl "знает" правильную информацию о строке и например будет считать ее длиной кол-во utf-символов, а не байтов). Второй - в виде последовательности обычных байтов. Разница во взведенном флаге UTF-8 у строки для первого случая. Так вот, функция from_to работает только для второго случая, для перекодировки строки байт из одной кодировки в другую. Для первого же случая вам нужны функции encode или encode_utf8.
спустя 50 минут [обр] Роман Чемисов(36/350)[досье]
Сергей Пантелеев[досье]
Гениально! Спасибо огромное.
Powered by POEM™ Engine Copyright © 2002-2005