Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » ActivePerl: обращение к файлу с диакритикой в имени

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

involute

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На Windows 8 с NTFS неожиданно оказались файлы, в именах которых есть очень иностранные символы с умляутами, ударениями, крышками и прочими радостями. Просто стянул из Сети архив и распаковал. Файлы легли нормально, архиватор не ругался. Но они "въелись" в диск: в файл-менеджерах сторонних производителей их невозможно подцепить мышкой и нажать на них Enter - операционка и приложения функционально их как бы не замечают в упор. Видит WinRAR и кое-как, с плясками, можно заставить их увидеть родной Проводник (опять же без функционального использования). Тот архив паковал явно либо иностранец (француз, поляк или вроде того), либо не из-под Windows:
Проводник с файлами.
 
 Пытаюсь прочитать Perl'ом папку с этими файлами...
 Пробую модули:

Код:
 
use encoding 'utf8';
use Encode;
use utf8;
use Unicode::Normalize;
use Lingua::Translit; #кодировок много, пока подобрать не удалось
use Text::Iconv; #модуль отказался корректно ставиться с репозитория
 

а также перекодировку через Encode::from_to(...), quotemeta(...) и прочую магию - в результате не продвинулся ни на шаг. Лучшее, что сумел вывести в консоль:

Код:
 
Date.jpg
Encounter with the Devil.jpg
Hru?e? - ilustrace.jpg
Modern? dekameron - ilustrace.jpg
monogrammed.jpg
O slunci, v?tru a m?s?ci - Ilustrace.jpg
R??e z ke?e n?zk?ho - Aj, aj, p??teli - Ilustrace.jpg
Serious talk.jpg
Tane?ek - ilustrace.jpg
U k???e - ilustrace.jpg
Vd??n? zv???tka - Ilustrace.jpg
 

 Нужно, чтобы, например, файл с именем U k???e - ilustrace.jpg (он же предпоследний на картинке, он же автоматически транслируется некоторыми файл-менеджерами в U krize - ilustrace.jpg), к которому обратились Perl'ом, был корректно прочитан по имени с диска и перекодирован в удобочитаемый строковый вид для дальнейших манипуляций со строкой, содержащей уже приемлемое имя: U krize - ilustrace.jpg, например. То есть те литеры, над которыми есть нестандартные знаки (крышки, ударения и т. п.), просто и надёжно конвертировались бы в такие же латинские символы, без диакритики. Разумеется, не должно быть велосипедов, все надежды на простоту и готовые функции/модули, а не на предварительное составление громоздкой таблицы символьных соответствий для последующей конвертации.
 
  Код на Perl:

Код:
 
#!C:\Perl\bin\perl -w
 
 
use strict;
use warnings;
use encoding 'utf8';
use Encode;
use utf8;
use Unicode::Normalize;
 
 
my $sourceDir = 'J:\Entertainment\Artworks01-02\Artworks01\Muttich__Camil_Vladislav\ilustrace';
 
opendir(DIR, $sourceDir) || die "can't opendir $sourceDir: $!";
 
    while (my $file = readdir DIR) {
      next if $file eq '.' || $file eq '..';
#      Encode::from_to($file, 'utf-8', 'windows-1251');
#      Encode::from_to($file, 'windows-1251', 'utf-8');
#      print NFD($file), "\n";
#      system("echo piconv -c -t 'ascii//TRANSLIT' $file"); #в именах остаются '??'
#      print quotemeta($file), "\n";
 
      print $file, "\n";
    }
 
closedir DIR;
 

 
Добавлено:
 P.S.: очень хочу штатными средствами ActivePerl, тянуть с CPAN'а модули с кучей зависимостей - не вариант.

Всего записей: 130 | Зарегистр. 16-08-2007 | Отправлено: 07:13 10-07-2014 | Исправлено: involute, 22:26 10-07-2014
involute

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ладно. Таки установил модуль Text::Unidecode. Пример из документации работает отлично, но как дело доходт до работы с именами файлов, опять затык. Делал

Код:
 
 Encode::_utf8_on($file);
 

и даже

Код:
 
Encode::decode_utf8($file);
 

 Просто уже не знаю, куда смотреть. Может, сюда: Региональные стандарты?.. Игрался также с chcp в cmd, но только между 866 и 1251, перебирать всё - рутина, надо знать кодировку.

Всего записей: 130 | Зарегистр. 16-08-2007 | Отправлено: 11:40 12-07-2014 | Исправлено: involute, 06:09 13-07-2014
involute

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Простой эксперимент: в Блокноте создаю Perl-скрипт, присваиваю переменной строку, внутри кавычек которой содержится то самое кривое имя (также пробовал разновидности оператора квотирования - без улучшений). Сохраняю в UTF-8. Теперь пытаюсь вывести эту строку в cmd - получаю:

Код:
 
<!-- warning: Wide character in print...
 

и таки вывод строки, причём в нужной кодировке, как на картинке.
 Но цеплять как имя файла и брать в обработку — конвертацию имени в латинский аналог — не получается никак. То есть на Windows не то, что с диска кривоимённый файл подцепить ActivePerl'ом проблема, а даже вывести строку с диакритикой без варнинга невозможно. Во всяком случае, у меня не получилось, даже с принудительным кодированием в utf8 на уровне модуля Encode или подобных.
 ЧЯДНТ? И как тут добиться отсутствия варнинга грамотным кодом - по-честному, а не насильственным подавлением в начале скрипта?

Всего записей: 130 | Зарегистр. 16-08-2007 | Отправлено: 06:16 13-07-2014 | Исправлено: involute, 06:25 13-07-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » ActivePerl: обращение к файлу с диакритикой в имени


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru