Четверг , 12 Декабрь 2024
ДомойПубликацииВосстановление правильных имён в ZIP архиве

Восстановление правильных имён в ZIP архиве

Привет, друзья. Сегодня расскажу о способе «забороть» небольшую проблему, связанную с zip-архивами. Но сначала небольшое вступления, дабы пояснить, зачем может понадобиться восстановление имён.

Для обмена файлами фирма использует «гэнэушную» ownCloud. ПО хорошее, позволяет делиться файлами и целыми каталогами.

Скачивать можно пофайлово или всё целиком. Во втором случае файлики упакуются в zip-архив. В общем, удобно, если бы не одно «но».

Восстановление правильных имён в 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).

Рейтинг: 0

Автор публикации

2 070
не в сети 4 месяца

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (1 голосов, в среднем: 5,00 из 5)
Загрузка...

Один комментарий

  1. Интересно. Попробуем использовать.

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

Наш сайт использует файлы cookies, чтобы улучшить работу и повысить эффективность сайта. Продолжая работу с сайтом, вы соглашаетесь с использованием нами cookies и политикой конфиденциальности.

Принять