Прочитать нелатинские символы dir / name файла

У меня есть некоторые файлы и каталоги (на Windows, но в конце концов я буду запускать один и тот же скрипт на Mac и Linux) с нелатинскими символами в именах, например:

Имя режиссера 01 - Проверка - X,

Я пытаюсь прочитать это имя и распечатать его, но безуспешно — я всегда получаю 01 - ???????? - X вместо.

Что я пробовал:

$items = scandir('c:/myDir/');
$name = $items[2];

echo mb_detect_encoding($name); // Returns "ASCII"echo '<br>';

echo $n = mb_convert_encoding($name, 'UTF-8', 'Windows-1252');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-1');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-15');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'Windows-1252', 'UTF-8');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'ISO-8859-1', 'UTF-8');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'ISO-8859-15', 'UTF-8');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('WINDOWS-1252', 'UTF-8', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('ISO-8859-1',   'UTF-8', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('ISO-8859-15',  'UTF-8', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('UTF-8', 'WINDOWS-1252', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('UTF-8', 'ISO-8859-1', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('UTF-8', 'ISO-8859-15', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

В результате у меня всегда одна и та же строка (я закодировал ее base64, так что вы можете видеть, что это одна и та же строка)

ASCII
01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

Что я могу с этим поделать?

Постскриптум То, что я пытаюсь в конечном итоге достичь, мне нужно сравнить две директории, и когда я зачитываю содержимое одной директории, я не могу сравнить ее с другой, потому что каталоги / имена файлов повреждены — мой скрипт получает имя 01 - ???????? - X и, очевидно, не может найти такой subdir во второй (сравнительный) каталог.

0

Решение

На самом деле мой предыдущий ответ был неверным. Проблема в том, что PHP5 не поддерживает UTF-8 для файловых операций.

Обходной путь будет использовать что-то вроде WFIO, который предоставляет собственный протокол для файловых потоков и позволяет PHP обрабатывать символы UTF-8 в файловых операциях. Вы можете увидеть в README, что синтаксис будет:

scandir("wfio://directory")

Удачи!

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]