Обновление: просто, чтобы не заставлять вас читать все: PHP, начиная с 7.1.0alpha2, поддерживает имена файлов UTF-8 в Windows. (Спасибо Анатолию-Бельскому!)
Следуя цепочкам ссылок в stackoverflow, я нашел часть ответа:
https://stackoverflow.com/a/10138133/3716796 Умберто Сальси
(и по тому же вопросу: https://stackoverflow.com/a/2950046/3716796 by Artefacto)
Вкратце: «PHP взаимодействует [s] с базовой файловой системой как « программа, не поддерживающая Unicode »», и из-за этого все имена файлов передаются PHP Windows и наоборот автоматически переводятся / перекодируются Windows. Это вызывает ошибки. И вы, похоже, не можете остановить автоматическое перекодирование.
(И https://stackoverflow.com/a/2888039/3716796 от Artefacto:
«PHP не использует широкие вызовы WIN32 API, поэтому вы ограничены кодовой страницей.»)
И на https://bugs.php.net/bug.php?id=47096 есть отчет об ошибке для PHP.
Хотя там Николас предполагает, что COM-объект может работать!
$ fs = new COM ('Scripting.FileSystemObject', null, CP_UTF8);
Может быть, я когда-нибудь попробую это сделать.
Осталась часть моего вопроса слева: есть ли PHP6, или он был отозван, или есть что-то новое по этой теме на PHP? < / em>
// полный вопрос
Большинству вопросов по этой теме от 1 до 5 лет. Может ли php теперь сохранить файл с помощью file_put_contents ($ dir. '/'. $ _POST ['fileName'], $ _POST ['content']);
когда $ _POST ['fileName'] закодирован в UTF-8, например "Крым.xml"? В настоящее время он сохранен как ÐšÑ € Ñ ‹Ð¼.xml
Я проверил переменную fileName, поэтому могу быть уверен, что это UTF-8: echo mb_detect_encoding ($ _ POST ['fileName']);
- Есть ли что-нибудь новое в PHP, что могло бы это сделать?
- В некоторых местах я читал, что PHP 6 сможет это сделать, но PHP 6, если я правильно помню, был отозван. ?
- В проводнике Windows я могу изменить имя файла на «Крым.xml». Насколько я понял старые вопросы и ответы, должно быть возможно использовать file_put_contents, если fileName-var просто закодирован в кодировку, используемую Windows 7 и этим диском NTFS. Есть даже 3 старых вопроса с ответами, которые утверждают, что они были успешными:
Обработка файлов PHP с использованием специальных символов UTF-8
Преобразование UTF-16LE в UTF-8 в php
и PHP: как создавать имена файлов в формате Unicode
В целом и наиболее одобренные ответы говорят, что это невозможно. Я уже сам проверил все предложенные ответы, и ни один из них не работает. - Как определенно и с абсолютной точностью узнать, в какой кодировке моя Win 7 и Explorer сохраняет имя файла на моем NTFS-диске и с настройкой немецкого языка? Как сказано: я могу создать файл "Крым.xml" в проводнике.
Мой вывод:
1. Либо file_put_contents не работает правильно при передаче fileName (что я пробовал с преобразованиями в UTF-16, UTF-16LE, ISO-8859-1 и Windows-1252) в Windows,
2. или file_put_contents просто не реализует способ вызова собственной файловой функции Windows соответствующим образом (так что эта вторая возможность будет означать, что это не ошибка, а просто не реализована.) (Например, в notepad ++ нет проблем с созданием, записью и переименованием файла файл с названием Крым.xml.)
Только один пример сообщений об ошибках, которые я получил, в данном случае, когда я использовал mb_convert_encoding ($ theFilename, 'Windows-1252', 'UTF-8')
«Предупреждение: file_put_contents (dirToSaveIn / ????. Xml): не удалось открыть поток: нет ошибки в C: \ aa xampp \ htdocs \ myinterface.lo \ myinterface \ phpWriteLocalSearchResponseXML.php в строке 26». сообщения об ошибках, начиная от «недопустимые символы» и заканчивая тем, что строка вообще не распознается.
Привет Джон