Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Русские имена файлов в Tk  (Прочитано 19523 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Lu2
Гость
« : 19-04-2007 12:43 » 

use bytes;    # не помогают
use locale;   #
use Tk;
my $mw  = MainWindow->new();
my $image = $mw->Photo('-format' => 'jpeg', '-file' => 'Юлия.jpg');

Cannot open '+ГTЮ+ГTы+ГTш+ГTм.jpg' in mode 'r' at C:/Perl/site/lib/Tk/Image.pm line 21.
-------------------------
Не удается открыть файлы с русскими именами (кодировка имен файлов - Windows).
Tk::image() Зачем-то переводит русские имена файлов в utf8 и выдает ошибку открытия файла.
Windows-XP
Perl = v5.8.4     01.2004
Tk:: = v804.027   11.2006
Конечно, можно временно переименовать файл, использовать, и затем переименовать обратно
(это работает). Или выполнить dir/X и сделать хеш  русс_имя => короткое_имя.
Но это неполноценные решения.
прагмы use bytes; use locale;  не помогают.
Можно ли сделать так, чтобы русские имена файлов не переводились в unicode ?
========================
Доп.инфо:

Tk::Image::new('Tk::Photo', 'MainWindow=HASH(0x1e381ec)', '-format', 'jpeg', '-file',
  '\x{de}\x{eb}\x{e8}\x{ff}.jpg')   called at C:/Perl/site/lib/Tk/Image.pm line 63

#sub new { ...
#21: my $obj = $widget->Tk::image('create',$leaf,@_);
#              где $leaf = 'photo';  @_ = ('-format' => 'jpeg', '-file' => 'Юлия.jpg');

#sub Construct {...
#63: *{"Tk::Widget::$name"}  = sub { $class->new(@_) };
========================

Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 19-04-2007 14:03 » 

Lu2, посмотри в файлах модуля Tk - возможно нам эти прагмы тоже стоят, но в по-своему.
Откуда берется имя файла7 Ты передаешь?

P.S.: я с utf8 в перле еще не сталкивался и только вчера взялся об этом почитать. Если подождешь, попробую разобраться, что и как.
« Последнее редактирование: 19-04-2007 14:05 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Lu2
Гость
« Ответ #2 : 20-04-2007 05:21 » 

Имена файлов я читаю из каталога readdir(DIR);
open(HR, "<Юлия.jpg"); прекрасно работает.

Прагмы use bytes; use locale; в модуле Tk не найдены.
И даже при вставке use bytes; в процедуру Tk::Image::new() ничего не меняется.
Так что, похоже, она здесь ни причём.
Прагма use bytes; работает только внутри области видимости блока
и воздействует только на функции работы со строками length, index, substr ...
Здесь же Perl где-то выполняет автоматический перевод 8-битных символов в unicode.
Отладчик в процедуру $widget->Tk::image('create',$leaf,@_); даже не заходит.
 
Демонстрационная программа widget.bat
при выборе файла с русским именем из диалога
тоже не может его открыть Жаль
  common dialog
    2. File selection dialog
  Text
    5. A search tool built with a text widget.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 20-04-2007 05:44 » 

Может имеет смысл файл сохранять в utf8?
винда она же только с наружи с кодировками работает, а внутри(системные вызовы и т.д.) сплошной юникод.
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 20-04-2007 08:20 » 

Lu2, попробуй не use bytes, а use utf8 и файл исходника в utf8 сохранять.

Проделай такой тест - интересен результат:

Код: (Perl)
#!/usr/bin/perl

opendir DIR, ".";
my @dirs = grep { ! m/^(\.)/ } readdir DIR;
closedir DIR;

print join("\n", @dirs), "\n";

В той же директории у меня файлы с русскими именами и распечатывается без порчи. Локаль ru_RU.KOI8-R (Linux).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Lu2
Гость
« Ответ #5 : 20-04-2007 11:15 » 

To RXL.Ваш тест работает так как и должно (имена файлов ни в какие unicode не переводятся).
Я уже писал(Ответ#2), что open(HR, "<Юлия.jpg"); прекрасно работает и с русскими именами.

Не работает открытие файлов именно в пакете Tk:
my $image = $mw->Photo('-format' => 'jpeg', '-file' => 'Юлия.jpg');
добирается до строки Tk::image.pm 21:
my $obj = $widget->Tk::image('create',$leaf,@_); #на входе имя файла еще нормальное
и вываливается с ошибкой в тексте которой имя файла уже переведено в unicode.

Попытка выполнить исходник в unicode сохраненый WordPad-ом не удалась.
Perl выдает многочисленные сообщения об ошибках типа
Bareword found where operator expected at my8.pl line 2, near "" (Missing operator before u?)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 20-04-2007 12:11 » 

здесь скорее всего проблема в отсутствии локали в TK либах, можно конечно попробывать пересобрать пакет (если есть сырцы)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 20-04-2007 16:17 » 

Здесь багрепорты на perl-Tk:
http://rt.cpan.org/Public/Dist/Display.html?Name=Tk

Судя по траблам у Tk есть траблы с кодировками. И похоже что как раз под виндой.

Sla, notepad тут не помошник - он использует или локальную 8 бит, или unicode 16 бит.
Использовать нужно редактор с поддержкой utf-8. Напр, notepad++ (см. на sf.net).

Добавлено через 1 час, 26 минут и 17 секунд:
Цитата
Cannot open '+ГTЮ+ГTы+ГTш+ГTм.jpg' in mode 'r' at C:/Perl/site/lib/Tk/Image.pm line 21.
Есть мысль, что перекодирование произошло дважды: здесь по 4 символа на один исходный.
« Последнее редактирование: 20-04-2007 17:48 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Lu2
Гость
« Ответ #8 : 23-04-2007 05:49 » 

http://rt.cpan.org/Public/Bug/Display.html?id=5905
#5905: Tk cann access files or folder with ascii-8 characters
Он самый. Этот баг висит уже 3 года...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 23-04-2007 10:01 » new

Последний релиз тоде трехлетней давности...
Видимо есть смысл двигаться в сторону GTK или Qt - для них модули тоже есть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines