Как понять кодировку, при скачивании через wget?

Стоит такая вот задача: скачать файл с сайта через wget (потому что он позволяет узнать настоящее имя файла)

Что может быть проще, но, первая сложность, это адрес до файла site.ru/export.html?hash=q1w2e3 (к сожалению не могу раскрывать настоящую ссылку, если только в личку)

Если открыть ссылку в браузере то сразу скачивается xls файл с русскими буквами в имени, допустим: "свободные_остатки.xls"

Натравливаем wget на ссылку, в ответ получаем в логе (откуда и можно узнать точное имя файла) = export.html?hash=q1w2e3

Ага понятно, нужен какой-то ключ, оказывается есть такой ключ --content-disposition и имя передается в этом теге в заголовках ответа, ура файл стал скачиваться и имя вроде верное НО, собственно пошел вопрос

Вот что в логах: \361\342\356\341\356\344\355\373\345_\356\361\362\340\362\352\350.xls
А вот что в папке: ëèãà_øèíû_ëåòî_ñâîáîäíûå_îñòàòêè.xls

PHP скрипт узнает что wget все скачал и выдирает из лога имя скачанного файла \361\342\356\341\356\344\355\373\345_\356\361\362\340\362\352\350.xls но при обращении по такому имени получаем бритву

Собственно задача, как же получить доступ к файлу по циферному имени, а еще лучше если получится сделать имя в utf-8 (хотя не принципиально, все равно потом имя файла будет изменено)

UPDATE
Нашел что строка, которая попадает в лог это windows-1251 в восьмеричном формате

$string = "\361\342\356\341\356\344\355\373\345_\356\361\362\340\362\352\350.xls";

function convertOctalToCharacter($octal) {
    return chr(octdec($octal[1]));
}

echo iconv('windows-1251', 'utf-8', preg_replace_callback('/\\\\([0-7]{1,3})/', 'convertOctalToCharacter', $string));


Ура, имя у меня теперь в кодировке utf-8, ну теперь конечно можно просто скачать этот файл снова но уже через курл со своим именем, но это же костыль.

Сейчас попробую после конвертации в windows-1251 обратиться к файлу, в теории должно прокатить да...
  • Вопрос задан
  • 1573 просмотра
Решения вопроса 1
@DimNS Автор вопроса
Помоги себе сам )) нашел решение, вдруг кому пригодится

// Исходная строка в кодировке windows-1251, но в виде восьмеричной строки
$string = "\361\342\356\341\356\344\355\373\345_\356\361\362\340\362\352\350.xls";

// Функция для преобразования из восьмеричного формата в обычный
function convertOctalToCharacter($octal) {
    return chr(octdec($octal[1]));
}

// Преобразуем из восьмеричного формата в обычный
$filename = preg_replace_callback('/\\\\([0-7]{1,3})/', 'convertOctalToCharacter', $filename);
// Перекодируем в utf-8
$filename_utf8 = iconv('windows-1251', 'utf-8', $filename);
// Переименуем файл в utf-8
rename($filename, $filename_utf8);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Какого-то эфемерного "настоящего" имени файла ни в одном из этих вариантов нет. Файла может вообще не существовать.

все равно потом имя файла будет изменено

Ну и нафиг вам вообще это имя сдалось? Сохраняйте сразу с тем именем, по которому сможете файл найти, опция output-document
А то и сразу курлом из php и загружать.
Ответ написан
romy4
@romy4
Exception handler
Смотрите заголовки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы