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

VANHALEN

Новичок
Всем доброго!
Хочу запустить рекруссивный поиск по маске и получить список файлов, чтобы что-то потом в ним сделать. В моём случае музыкальный плеер например.
Код:
function glob_recursive($dir, $mask){
        foreach(glob($dir.'/*') as $filename){
                if(strtolower(substr($filename, strlen($filename)-strlen($mask), strlen($mask)))==strtolower($mask)) echo '<a href="'.$filename.'">'.$filename.'</a><br>';
                if(is_dir($filename)) glob_recursive($filename, $mask);
        }
}
glob_recursive("MUSIC", ".mp3");
Только вот так вот сообразил. Естественно, что читаются и проигрываются только файлы на латинице. Есть желание сделать хранилище универсальным, поэтому переименовывать файлы и папки на латинице не хочется. Есть какой-то вариант, чтобы можно было пользоваться полученым списком как есть? Тоесть получать его в таком виде, в котором можно загрузить в плеер на страничке, или скачать не кракозябами.
 

ksnk

прохожий
У glob есть специальные флаги, в том числе GLOB_ONLYDIR. Рекурсивно бегать лучше в 2 приема - рекурсивно по каталогам и по маске, не нужно будет манипулировать с подстроками.
И да, в общем случае - задача с разными кодировками не решается, но можно добираться до него через php-скрипт, который перекодирует GET-параметр - имя файла в системную кодировку.
 

VANHALEN

Новичок
Рекурсивно бегать лучше в 2 приема
Спасибо, попробую на досуге.
И да, в общем случае - задача с разными кодировками не решается, но можно добираться до него через php-скрипт, который перекодирует GET-параметр - имя файла в системную кодировку.
Брр... Хоть какой-то пример бы. Всяко же наверное кто-то делал плеер. А то может имеет смысл тогда хранить всё отдельно в базе данных, тогда уже и медиатеку целую можно устроить. На лету то особенно метадату не почитаешь и не посортируешь. Нет, но в любом случае хочется иметь возможность слить пару папок прямо с диска и не париться потом что за песня под названием rtgbiwtib.mp3

P.S. Есть кстати какая нибудь приблуда удобная для чтения и записи метаданных на PHP?
 

ksnk

прохожий
Ну, если на коленке и в качестве чернового примера
PHP:
if (isset($_GET['file'])) {
    $filename=iconv('utf-8','cp1251',$_GET['file']);
    if(is_readable(__DIR__.'/'.$filename))
        readfile(__DIR__.'/'.$filename);
    else
        echo 'file not found. Sorry.';
} else {
    echo 'there is nothing here';
}
кодировки, хидеры и ошибки допиливаются напильником по месту.
 

fixxxer

К.О.
Партнер клуба
А что, php-шный glob() до сих пор под винду собирается с ansi вызовами api?
Это какой-то позор.
 

fixxxer

К.О.
Партнер клуба
Перекодировать utf16-utf8, в принципе, не проблема даже без всяких iconv/mbstring, это строк 20 кода. И флажок типа GLOB_MULTIBYTE добавить для совместимости, на юниксах игнорировать.

Как вариант, сделать mb_glob(), но только ради винды как то фиг его знает.

(А win32 extension выпилили, чтоли? Так-то на нем сделать было бы совсем несложно.)
 

artoodetoo

великий и ужасный
А что, php-шный glob() до сих пор под винду собирается с ansi вызовами api?
Да. Имена файлов/директорий надо интерпретировать как текст в виндовой кодировке по умолчанию. Для русской винды — 1251.

В винде вообще есть проблемы с мультибайтностью. Никак не получится вывести UTF8 из PHP в текстовой консоли, например. Несмотря на формальную поддержку кодовой страницы 65001.
 
Последнее редактирование:

artoodetoo

великий и ужасный
1.php
PHP:
<?php

// текст в кодировке UTF-8
echo "Я достаю из широких штанин";
 

fixxxer

К.О.
Партнер клуба
Ну, с glob() проблема не в винде, а в php, тащем-та.

А стандартная виндовая консоль это вообще какая-то убогая хрень, как этим пользуются, не понимаю.
 
Сверху