В Unix и Linux (и, возможно, также в OS X) текущая кодировка файловой системы задается параметром LC_CTYPE
locale (см. Функцию setlocale()
). Например, он может оценить что-то вроде en_US.UTF-8
, что означает кодировку UTF-8. Затем имена файлов и их пути могут быть созданы с помощью fopen()
или получены с помощью dir()
с этой кодировкой.
В Windows PHP работает как «не поддерживающая Юникод программа», затем имена файлов конвертируются из UTF-16, используемого файловой системой (Windows 2000 и более поздние версии), в выбранную «кодовую страницу». Панель управления «Язык и региональные стандарты», вкладка «Форматы» устанавливает кодовую страницу, полученную с помощью параметра LC_CTYPE
, а «Административный -> Язык для программ, не поддерживающих Юникод», устанавливает кодовую страницу перевода для имен файлов. В западных странах параметр LC_CTYPE
оценивается примерно как language_country.1252
, где 1252 - это кодовая страница, также известная как «кодировка Windows-1252», которая аналогична (но не совсем равна) ISO-8859-1. В Японии вместо этого обычно устанавливается кодовая страница 932 и так далее для других стран. Под PHP вы можете создавать файлы, чье имя может быть выражено с помощью текущей кодовой страницы. И наоборот, имена файлов и пути, извлеченные из файловой системы, преобразуются из UTF-16 в байты с использованием наиболее подходящей текущей кодовой страницы .
Это сопоставление является приблизительным, поэтому некоторые символы могут быть искажены непредсказуемым образом. Например, Caffé Brillì.txt
будет возвращено dir()
в виде строки PHP Caff\xE9 Brill\xEC.txt
, как и ожидалось, если текущая кодовая страница равна 1252, тогда как в японской системе будет возвращено приблизительное значение Caffe Brilli.txt
, поскольку ударные гласные отсутствуют в 932 кодовую страницу, а затем заменить ее «наилучшим образом» не акцентированные гласные. Символы, которые вообще не могут быть переведены, извлекаются как ?
(знак вопроса). Как правило, в Windows нет безопасного способа обнаружения таких артефактов.
Более подробная информация доступна в моем ответе на Ошибка PHP №. 47096 .