Я не могу говорить однозначно за PHP, но я подозреваю, что это та же самая основная проблема, что и с Python 2 (до того, как позже добавили специальную поддержку для строковых имен Unicode).
Я считаю, что PHP работает с именами файлов, используя стандартные функции open-et-al библиотеки C, которые основаны на байтах. В Windows (NT) они пытаются закодировать реальное имя файла Unicode, используя системную кодовую страницу. Это может быть cp1252 (аналогично ISO-8859-1) для западных машин или cp932 (аналог Shift-JIS) на японских машинах. Для любых символов, которых нет в системной кодовой странице, вы получите символ «?», И вы не сможете ссылаться на этот файл.
Чтобы обойти эту проблему, PHP должен будет сделать то же самое, что и Python 3.0, и начать использовать строки Unicode для имен файлов (и всего остального), используя функции _wopen'-et-al для получения доступа к именам файлов в формате Unicode. под виндой. Я ожидаю, что это произойдет в PHP6, но на данный момент вы, вероятно, в значительной степени напичканы. Вы можете изменить системную кодовую страницу на cp932, чтобы получить доступ к именам файлов, но вы все равно получите символы «?» Для любых других символов Юникода, не входящих в Shift-JIS, и в любом случае вы действительно не хотите, чтобы все внутренние строки вашего приложения были Shift-JIS, поскольку это довольно ужасная кодировка.
Если ваши собственные сценарии выбирают, как хранить файлы, я бы настоятельно рекомендовал использовать простые имена файлов на основе первичного ключа, такие как «4356», локально, помещая реальное имя файла в базу данных и передавая файлы с помощью переписывания / трейлинга. части пути в URL. Сохранение предоставленных пользователем имен файлов в ваших локальных именах файлов затруднительно, и это может стать причиной аварийных ситуаций в системе безопасности, даже не беспокоясь о Юникоде.