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 |
|