Привет, друзья. Сегодня расскажу о способе «забороть» небольшую проблему, связанную с zip-архивами. Но сначала небольшое вступления, дабы пояснить, зачем может понадобиться восстановление имён.
Для обмена файлами фирма использует «гэнэушную» ownCloud. ПО хорошее, позволяет делиться файлами и целыми каталогами.
Скачивать можно пофайлово или всё целиком. Во втором случае файлики упакуются в zip-архив. В общем, удобно, если бы не одно «но».
На беду, структура формировалась из каталогов и файлов, названных русскими буквами. При открытии в Windows это превращалось в мешанину символов:
Если использовать латиницу подобной проблемы не возникнет.
При этом, имена записывались в кодировке UTF-8 — просмотр файла архива это подтверждал. Понятно, что дело было в неверно установленных флагах в архиве — имена интерпретировались в иной кодировке. По большому счёту, неважно, почему так происходило — неверная настройка ownCloud или корявая версия зипа. Функционирование сервера находится вне моей «юрисдикции».
Понятие флаг в мире компьютеров трактуется как установка битов (минимальный разряд информации, принимает значение 0 или 1) в байте (минимально адресуемая единица информации, состоит из 8 битов).
Чтобы не возиться с установкой правильных флагов, написал небольшой скрипт, который «в лоб» конвертирует названия в кодировку CP866, для дефолтного отображения имени.
Для использования просто закиньте в папку со скриптом проблемные архивы и запустите скрипт. Делать эту нужно на сервере или локально, например, с помощью Денвера.
<?php
/**
* Извлечение файлов из zip-архива, сделанного в никсах
*
* Особенность — для именования файлов/директорий используется кодировка UTF-8,
* но соответствующие флаги не устанавливаются! В результате,
* при распаковке в Win получается псевдографика вместо имён.
* ВНИМАНИЕ! Операции проводятся над найденными архивами, все возможные
* последствия берёте на себя.
* Делайте резервные копии файлов!
*
* Для работы необходимо расширение mbstring, которое есть почти на всех хостингах.
*/
header('Content-Type:text/plain; charset=utf-8');
$from_cp = 'UTF-8'; # из какой кодировки
$to_cp = 'CP866'; # в какую, по умолчанию используется эта кодировка
foreach (glob(dirname(__FILE__) . DIRECTORY_SEPARATOR . '*.zip') as $v) {
$zip = new ZipArchive;
$zip->open($v);
for ($i = 0; $i < $zip->numFiles; $i++) { # цикл по ресурсам
$entry = $zip->getNameIndex($i); # имя ресурса
$entry_dos = mb_convert_encoding($entry, $to_cp, $from_cp); # сонвертировать название в досовскую кодировку
$zip->renameIndex($i, $entry_dos); # переименовать
}
$zip->close();
}
echo 'ok';
Мини-инструкция: создаёте файл с расширением PHP, например, zip-pull-cp.php и копируете в него код выше. Сохраняете. Кидаете этот файл с архивами в какую-нибудь папку на сервере. Запускаете, набрав в адресной строке браузера:
http://my-site.name/путь-к-файлу/zip-pull-cp.php
Когда увидите надпись ok можно забирать исправленные файлы.
Для работы в пыхе должно быть установлено расширение mbstring. На подавляющем большинстве хостингов так и есть, так что проблем возникнуть не должно.
Возможно, позже дополню статью «правильным» скриптом, который пробежится по файлам и перезапишет нужные байты. Сейчас не вижу в этом смысла, используемое решение прекрасно отработало в моём случае.
Вы когда-нибудь думали, что можно создать группу практически без музыкальных инструментов? Оказывается, можно.
Предлагаю познакомиться с творчеством немецкой а капелла группы Van Canto. Композиция — Wishmaster (в оригинале исполняет финская группа Nightwish).
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц
Интересно. Попробуем использовать.