У меня есть некоторые файлы и каталоги (на 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 во второй (сравнительный) каталог.
На самом деле мой предыдущий ответ был неверным. Проблема в том, что PHP5 не поддерживает UTF-8 для файловых операций.
Обходной путь будет использовать что-то вроде WFIO, который предоставляет собственный протокол для файловых потоков и позволяет PHP обрабатывать символы UTF-8 в файловых операциях. Вы можете увидеть в README, что синтаксис будет:
scandir("wfio://directory")
Удачи!
Других решений пока нет …