Главная » Программирование для чайников » php | [ Добавить статью ] |
Проблемы с кириллицей при распоковке zip-архивов с помощью php (скрипт PclZip)
Данный глюк обнаружил на работе, когда менеджеры начали жаловаться, что одна из функций самописной CMS не работает. Начав разбираться я обнаружил, что одна из папок, в которую php-скрипт перемещал распакованные из zip-архива файлы, постоянно забивалась каким-то мусором (файлами с непонятной кодировкой, у которых вместо букв — квадратики и прочие ошмётки).
Скрипт заключался в следующем: распаковывал файлы из архива, проделывал над ними махинации и затем удалял их. То-есть папка не должна была ничем заполняться. Я проверил скрипт — всё казалось в порядке. Попробовал удалить эти файлы с помощью файлового менеджера — не получилось:
А ведь именно из-за этих мусорных файлов и отказала функция, на которую жаловались менеджеры. Написал в службу поддержки хостинга — они их удалили.
Буквально через час смотрю — снова эти файлы. В общем изучил ситуацию и пришёл к выводу, что это так распаковываются файлы из zip-архива, в названиях которых присутствуют русские буквы (кириллические символы). Сразу стало очевидно, что проблема с кодировкой. Сказать менеджерам, чтобы они не использовали кириллицу в именах файлов внутри архиве — бесполезно, обязательно накасячат (к тому же зачем оставлять такой баг). Пришлось по-быстрому всё исправить.
Устранение проблемы
Конечно же всё оказалось очень просто. Для распаковки файлов использовалась php-библиотека "PclZip". Открываем ее и видим функцию privReadCentralFileHeader, в которой присутствует следующий код://--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']);
if ($p_header['filename_len'] != 0)
{
$p_header['filename'] = fread($this->zip_fd, $p_header['filename_len'];
}
else
$p_header['filename'] = '';
Всё что нам необходимо — перевести название файла в нужную нам кодировку. В моём случае это была UTF-8, поэтому я исправил строчку получения имени файла вот на такую:
После этого всё стало работать корректно. Глюки наконец-то исчезли (как оказалось, им было уже порядка года^^).
Удаление с сервера файлов с нарушенной кодировкой в имени
А как же удалить файлы с нарушенной кодировкой, если при любой попытке это сделать файловый менеджер выдаёт ошибку "невозможно удалить файл"? Я нашёл такое решение: написал простенький php-скрипт, который обходит все файлы в папке, берёт их имена и удаляет с сервера (функция unlink).
Если нужно удалить выборочно, то можно удалять все файлы, имена которых содержат символы, код которых находится в заданном интервале (какие именно границы интервала использовать определите сами). Если файлы нужны, то их можно переименовать в нормальные случайные имена, или даже в их реальные имена, используя всё ту же функцию iconv.
Добавлено: 21.10.2011 | Просмотров: 8814 | Рейтинг: 5.0/2 |
Теги:
Комментарии (4) | |||||
| |||||